AWS Lambda生成S3预签名POST后,找不到文件上传URL求解答
解答:预签名POST的上传URL说明及代码优化
核心结论
你返回结果里的url字段就是用于文件上传的POST地址:https://s3.eu-west-2.amazonaws.com/xxx。预签名POST的结构本身就是这样:
url:S3接收表单上传的端点地址fields:上传时必须一起提交的签名验证字段(包含key、Policy、签名等核心验证信息)
代码优化建议
你的Lambda功能可以正常生成预签名POST,但有几个需要修正的细节:
- 禁止硬编码AWS密钥:当前代码直接写入
accessKeyId和secretAccessKey,存在严重安全风险。正确做法是给Lambda函数配置具备S3权限的IAM角色,AWS SDK会自动从环境变量获取凭证。 - 修正Expires注释错误:代码注释标注为10分钟,但
60 * 60是3600秒(1小时),注释与实际过期时间不符。 - 规范请求参数获取方式:如果Lambda通过API Gateway触发,
fileName通常嵌套在event.body中(需先解析JSON),而非直接从event根节点读取,示例修改如下:
// 适配API Gateway触发场景,解析请求体 const requestBody = JSON.parse(event.body); const fileName = requestBody.fileName;
上传使用示例
拿到返回的url和fields后,可通过curl发起POST上传请求:
curl -X POST https://s3.eu-west-2.amazonaws.com/xxx \ -F key="upload/yasin-test-aaa.mp4" \ -F bucket="xxx" \ -F X-Amz-Algorithm="AWS4-HMAC-SHA256" \ -F X-Amz-Credential="AKIA4VX7VVP3LMLE3CHF/20240520/eu-west-2/s3/aws4_request" \ -F X-Amz-Date="20240520T173547Z" \ -F Policy="eyJleHBpcmF0aW9uIjoiMjAyNC0wNS0yMFQxODozNTo0N1oiLCJjb25kaXRpb25zIjpbWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDczNzQxODI0XSx7ImtleSI6InVwbG9hZC95b3J1bS1yZXNpbWxlcmkveWFzaW4tdGVzdC1hYWEubXA0In0seyJidWNrZXQiOiJjZG4udG9uem8uY29tLnRyIn0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In0seyJYLUFtei1DcmVkZW50aWFsIjoiQUtJQTRWWDdWVlAzTE1MRTNDSEYvMjAyNDA1MjAvZXUtd2VzdC0yL3MzL2F3czRfcmVxdWVzdCJ9LHsiWC1BbXotRGF0ZSI6IjIwMjQwNTIwVDE3MzU0N1oifV19" \ -F X-Amz-Signature="3a8372b714f7327de2aef6076210660f51180b077fc960ae7a7179449529d52e" \ -F file=@/path/to/your/yasin-test-aaa.mp4
内容的提问来源于stack exchange,提问作者ahmet simsek
相关产品推荐
相关产品推荐

