如何安全地将大文件从浏览器上传到 Amazon S3 上的存储桶?

How can I safely upload a large file from the browser to a bucket on Amazon S3?

我需要允许用户从 Web 应用程序上传大文件(超过 2GB),我不想公开公司的访问密钥。

我的一个队友发现要在没有密钥的情况下上传,我们需要使用预签名的 urls。这样,前端向后端请求一个预签名的url,前端收到后通过HTTP请求上传文件。以下是执行此操作的代码:

const presignedUrl = '...'

const body = {
    data: file,
};

const req = new HttpRequest('PUT', presignedUrl, body, {
    headers: new HttpHeaders({
        'Content-Type': contentType,
        'x-amz-acl': 'public-read',
    }),
    reportProgress: true,
});

我发现要通过 AWS Node SDK 上传大文件,我们只需要设置作为参数传递给上传方法的选项对象,如下所示:

const options: AWS.S3.ManagedUpload.ManagedUploadOptions = {
    partSize: 10 * 1024 * 1024, // each part is 10 MB
    queueSize: 2, // 2 parts are uploaded concurrently
};

const params: AWS.S3.PutObjectRequest = {
    Bucket: 'teste-multipart-upload',
    Key: key,
    Body: body,
};

return s3.upload(params, options, (err, data) => {
    if (err) throw err;
    console.log(data);
});

如何同时做这两件事?通过 SDK 上传到预签名 url 或通过提供的 REST API 上传大文件(如果还有其他选项我想知道)。

这可以通过一系列步骤完成:

  1. 后台发起分片上传
  2. 后端创建一系列预签名 URL,每个部分一个,并将它们发送给客户端。
  3. 客户端将各个部分上传到那些预先签名的部分 URL(以任何顺序)。
  4. 客户端告诉后端完成,后端完成分片上传

有关示例,请参阅 Multipart uploads with S3 pre-signed URLs