如何使用 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/awaits3.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.eachasync.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 上传访问

无法使用回形针导轨上传到S3 5.配置选项无效:存储桶

使用 HTTP PUT 将文件上传到 Amazon S3

使用 aws-sdk 将 gm 调整大小的图像流上传到 s3

如何使用 aws-sdk 获取 AWS S3 上文件的 URL?