使用createPresignedPost上传到AWS S3(Next.js API)如何判断上传是否成功?
S3预签名POST上传结果判断与回调方案
你当前使用的createPresignedPost接口仅负责生成带授权信息的上传配置,本身不参与实际文件上传流程,因此无法在生成配置的环节直接获取上传结果,两个核心问题的解决方案如下:
一、文件上传成功的判断方式
- 前端侧直接判断:前端拿到你返回的post签名配置后,向S3发起POST上传请求,S3会返回明确的HTTP状态码:返回204 No Content即为上传成功,返回4xx/5xx状态码即为上传失败,前端可直接根据状态码上报结果给你的后端。
- 后端侧校验判断:如果需要更可靠的校验逻辑,可在生成预签名配置时,将对应的文件key(
req.query.file)与业务关联标识存入你的业务数据库,在签名有效期(你配置的60秒)过后,调用headObject接口查询对应Bucket下的目标key是否存在,接口返回200即为上传成功,返回404即为未上传。
二、S3存入文件后的回调实现
S3原生支持上传完成后的自动回调,有两种常用实现方案:
方案1:在预签名配置中直接指定回调规则
你可以在createPresignedPost的参数中新增回调相关字段,示例修改后的代码如下:
const post = s3.createPresignedPost({ Bucket: process.env.BUCKET_NAME, Fields: { "Content-Type": "application/pdf", "Content-Disposition": `inline; filename="${req.query.file}"`, key: req.query.file, // 上传成功后S3会重定向到该地址,适合同步上传场景 "success_action_redirect": "你的业务后端回调接口地址", // 若为前端异步上传场景,可配置返回指定状态码 "success_action_status": "201" // 上传成功后返回201状态码,附带文件元数据 }, Expires: 60, // seconds Conditions: [ ["content-length-range", 0, 5048576], // up to 1 MB // 新增字段需要在条件中声明允许传入 ["starts-with", "$success_action_redirect", ""], ["starts-with", "$success_action_status", ""] ], }); if (post) { console.log("Post data --->", post); res.status(200).json({ post }); }
方案2:配置S3 Bucket事件通知(推荐,可靠性更高)
无需修改现有预签名生成逻辑,直接在S3控制台为你的目标Bucket配置事件触发规则:
- 触发事件选择
s3:ObjectCreated:*,覆盖所有对象创建场景(包含POST上传) - 触发目标可配置为你的业务后端HTTP接口、Lambda函数、SQS队列等
- 只要有文件成功存入Bucket,S3就会自动向你配置的目标推送包含文件key、大小、上传时间等完整元数据的事件通知,完全异步不依赖前端上传逻辑,适合生产环境使用。
内容的提问来源于stack exchange,提问作者LGarcia
相关产品推荐
相关产品推荐

