如何使用 aws-sdk 将文件同步上传到 S3?
Posted
技术标签:
【中文标题】如何使用 aws-sdk 将文件同步上传到 S3?【英文标题】:How to synchronously upload files to S3 using aws-sdk? 【发布时间】:2019-12-16 15:15:45 【问题描述】:我正在尝试将文件上传到我的 S3 存储桶,然后退出我的上传功能。问题是我在上传返回存储的数据之前退出了函数。
我尝试将async/await
与s3.upload
一起使用,但我不相信s3.upload
是一个承诺,因此它不会做任何事情。
例如:
for (const file of files)
const params =
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
;
const stored = await s3.upload(params, (err, data) =>
if (err) console.log("error", err, err.stack);
return console.log(data);
);
console.log(stored);
console.log("leave loop")
我尝试使用带有async.each
和async.eachSeries
的异步实用程序模块,如in this stack answer 引用,如下所示:
const saveFile = async file =>
const params =
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
;
s3.upload(params, (err, data) =>
if (err) console.log("error", err, err.stack);
console.log(data);
);
;
await async.eachSeries(files, saveFile, err =>
if (err) console.log(err);
);
console.log("leave loop")
但它仍然过早地点击“离开”。我误解了一些东西,但我不确定是什么。
更新:
s3.upload
返回一个 managedUpload
对象 - 这似乎是 await 提前触发的原因。当managedUpload
解决/完成时触发回调。
那么有没有办法await
完成的对象而不是managedUpload
?
【问题讨论】:
【参考方案1】:您应该尝试在ManagedUpload
上致电promise() 以获得Promise 并等待其解决:
for (const file of files)
const params =
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
;
try
const stored = await s3.upload(params).promise()
console.log(stored);
catch (err)
console.log(err)
console.log("leave loop")
【讨论】:
以上是关于如何使用 aws-sdk 将文件同步上传到 S3?的主要内容,如果未能解决你的问题,请参考以下文章
通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问
通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问