使用 nodejs aws-sdk 将较大文件上传到 s3 的最佳方法是什么? MultipartUpload 与 ManagedUpload 与 getSignedURL 等

what the best way to upload larger files to s3 with nodejs aws-sdk? MultipartUpload vs ManagedUpload vs getSignedURL, etc

我正在尝试查看 AWS 必须提供的将文件上传到 s3 的方式。当我查看 their docs it confused the hell of out me. Looking up to the various resources I came to know a bit more resources like s3.upload vs s3.putObject 时,其他人意识到 API 网关和使用 lambda 函数上传文件存在物理限制。

特别是在上传 1-100 GB 等大文件的情况下,AWS 建议使用多种方法将文件上传到 s3。其中包括 createMultipartUpload, ManagedUpload, getSignedURL 和大量其他内容。

所以我的问题是: 将大文件上传到 s3 的最佳和最简单方法是什么,我也可以取消上传过程。分段上传 seems to tedious.

使用Streams上传到S3,这样Node.JS服务器不会占用太多资源。

const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const stream = require('stream');
 
function upload(S3) {
  let pass = new stream.PassThrough();
 
  let params = {
    Bucket: BUCKET,
    Key: KEY,
    Body: pass
  };
 
  S3.upload(params, function (error, data) {
    console.error(error);
    console.info(data);
  });
 
  return pass;
}
 
const readStream = fs.createReadStream('/path/to/your/file');
readStream.pipe(upload(S3));

这是通过流本地文件,流也可以来自请求。

如果想听进度可以使用ManagedUpload

const manager = S3.upload(params);
 
manager.on('httpUploadProgress', (progress) => {
  console.log('progress', progress)
  // { loaded: 6472, total: 345486, part: 3, key: 'large-file.dat' }
});

没有将文件上传到 S3 的最佳方式

这取决于您想要什么,尤其是您要上传的对象的大小。

  1. putObject - 适合小于 20MB 的对象

  2. Presigned Url - 允许您绕过 API 网关并将 5GB 以下的对象放入 s3 存储桶

  3. Multipart Upload - 允许您分块上传文件,这意味着即使连接暂时中断,您也可以继续上传。您可以通过此方法上传的最大文件大小为 5TB。