使用 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 的最佳方式
这取决于您想要什么,尤其是您要上传的对象的大小。
putObject - 适合小于 20MB 的对象
Presigned Url - 允许您绕过 API 网关并将 5GB 以下的对象放入 s3 存储桶
Multipart Upload - 允许您分块上传文件,这意味着即使连接暂时中断,您也可以继续上传。您可以通过此方法上传的最大文件大小为 5TB。
我正在尝试查看 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 的最佳方式
这取决于您想要什么,尤其是您要上传的对象的大小。
putObject - 适合小于 20MB 的对象
Presigned Url - 允许您绕过 API 网关并将 5GB 以下的对象放入 s3 存储桶
Multipart Upload - 允许您分块上传文件,这意味着即使连接暂时中断,您也可以继续上传。您可以通过此方法上传的最大文件大小为 5TB。