如何安全地将大文件从浏览器上传到 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 上传大文件(如果还有其他选项我想知道)。
这可以通过一系列步骤完成:
- 后台发起分片上传
- 后端创建一系列预签名 URL,每个部分一个,并将它们发送给客户端。
- 客户端将各个部分上传到那些预先签名的部分 URL(以任何顺序)。
- 客户端告诉后端完成,后端完成分片上传
我需要允许用户从 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 上传大文件(如果还有其他选项我想知道)。
这可以通过一系列步骤完成:
- 后台发起分片上传
- 后端创建一系列预签名 URL,每个部分一个,并将它们发送给客户端。
- 客户端将各个部分上传到那些预先签名的部分 URL(以任何顺序)。
- 客户端告诉后端完成,后端完成分片上传