如何通过一次调用向S3写入多个对象?
如何通过一次调用向S3批量写入对象
S3没有原生支持单次API调用写入多个独立对象的接口,但可以通过以下两种方式高效完成批量写入,实现近似"一次操作"的体验:
方案一:并发执行PutObject请求(中小批量推荐)
通过Promise.all并发发起多个PutObjectCommand请求,代码上只需一次调用即可完成所有对象的上传处理,示例代码如下:
const { PutObjectCommand, S3Client } = require("@aws-sdk/client-s3"); // 初始化S3客户端 const s3Client = new S3Client({ region: process.env.AWS_REGION }); // 待上传的对象数组,每个元素包含Key、Body、ContentType等必要参数 const objectsToUpload = [ { Key: "photo1.jpg", Body: resizedImg1, ContentType: "image/jpeg" }, { Key: "photo2.png", Body: resizedImg2, ContentType: "image/png" }, // 更多待上传对象... ]; // 批量上传函数 async function batchUploadToS3(bucketName, uploadObjects) { // 生成所有PutObject命令 const uploadCommands = uploadObjects.map(obj => { return new PutObjectCommand({ Bucket: bucketName, ...obj }); }); // 并发执行所有上传请求,同时捕获错误避免批量失败 const uploadResults = await Promise.all( uploadCommands.map(command => s3Client.send(command).catch(error => ({ error, key: command.input.Key })) ) ); // 分离成功和失败的结果 const successfulUploads = uploadResults.filter(res => !res.error); const failedUploads = uploadResults.filter(res => res.error); return { successfulUploads, failedUploads }; } // 调用批量上传 batchUploadToS3(process.env.AWS_S3_PHOTO_BUCKET, objectsToUpload) .then(result => { console.log(`成功上传 ${result.successfulUploads.length} 个对象`); if (result.failedUploads.length > 0) { console.log(`上传失败的对象:`, result.failedUploads); } }) .catch(globalError => console.error("批量上传全局错误:", globalError));
方案二:S3批量操作(超大量对象推荐)
如果需要上传的对象数量极多(比如上万级),可以使用S3官方的批量操作功能,步骤如下:
- 整理待上传对象的信息为CSV格式清单文件(包含Key、数据源路径等),并将该清单上传到S3的某个存储桶中
- 通过AWS控制台或API创建S3批量作业,指定作业类型为
PutObject,并指向之前上传的清单文件 - S3会自动批量处理所有对象,无需手动管理并发和请求限流
这种方式适合大规模批量场景,能有效避免手动并发请求可能遇到的限流问题。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

