作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,需要上传超过 100,000 files
( 1MB
每个)到 S3 Bucket
.我知道 S3 有上传大文件的 API,但想知道他们是否有上传大量文件的 API。
我目前正在使用 putObject
并尝试过 upload
将我的文件上传到 S3 的 API。问题是上传时间太长(浏览器超时后完成)并使用大量内存(超过 512MB
允许的限制)。
保存文件的代码:
saveFile: async (fileUrl, data) => {
await s3.putObject({
Bucket: bucket,
Key: fileUrl,
Body: JSON.stringify(data)
}).promise();
},
saveFile
在这样的循环中:
for (let file of files) {
await saveFile(file.url, file.data);
}
stream
可能有助于减少内存需求,但我想知道时间上有什么不同吗?如果是,我该如何实现?谢谢。
最佳答案
我通常更喜欢使用 managed upload API , 而不是 putObject 方法。它处理带有 multiplart 上传的大文件,此外它还支持流(您不能将流与 putObject 一起使用,因为该 API 需要总文件大小)。
例如,从 Node :
const fs = require('fs');
const AWS = require('aws-sdk');
const s3 = new AWS.S3({});
s3.upload({
Bucket: 'xxx',
Key: 'fileName.png',
Body: fs.createReadStream('/home/bar/Desktop/fileName.png')
}).promise(); // or callback
for
的问题循环是它将一个接一个地连续上传对象。相反,您可以使用
await Promise.all([/* your list*/].map(/* ... */))
,它将并行执行所有上传 - 但是 - 100,000 到目前为止是一个太大的数字。
cargo
或
queue
方法,您的代码如下所示:
const PARALLEL_UPLOADS = 10;
const q = async.queue((task, callback) => {
s3.upload({
Bucket: 'xxx',
Key: task.dest,
Body: fs.createReadStream(task.src)
}, callback)
}, PARALLEL_UPLOADS);
q.drain = function() {
console.log('all items have been processed');
};
q.push([
{ src: 'image1.png', dest: 'images/image1.png' },
{ src: 'image2.png', dest: 'images/image2.png' },
]);
关于node.js - 一次将大量文件上传到 AWS S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584357/
我是一名优秀的程序员,十分优秀!