繁体   English   中英

将远程文件数组流式传输到Node.js中的Amazon S3

[英]Stream array of remote files to amazon S3 in Node.js

我有一个URL数组,指向要上传到Amazon S3存储桶的文件。 数组中有2916个URL,这些文件的总大小为361MB。

我尝试使用流来完成此操作,以避免使用过多的内存。 我的解决方案在所有2916个文件都已上传的意义上起作用,但是(至少其中一些)上传似乎是不完整的,因为每次运行时上传的文件总大小在200MB到361MB之间。

// Relevant code below (part of a larger function)

/* Used dependencies and setup:
const request = require('request');
const AWS = require('aws-sdk');
const stream = require('stream');
AWS.config.loadFromPath('config.json');
const s3 = new AWS.S3();
*/

function uploadStream(path, resolve) {
    const pass = new stream.PassThrough();
    const params = { Bucket: 'xxx', Key: path, Body: pass };
    s3.upload(params, (err, data) => resolve());
    return pass;
}

function saveAssets(basePath, assets) {
    const promises = [];
    assets.map(a => {
      const url = a.$.url;
      const key = a.$.path.substr(1);
      const localPromise = new Promise(
        (res, rej) => request.get(url).pipe(uploadStream(key, res))
      );
      promises.push(localPromise);
    });
    return Promise.all(promises);
}

saveAssets(basePath, assets).then(() => console.log("Done!"));

诺言有点混乱,但是我需要能够知道何时所有文件都已上传,并且这一部分似乎至少运行良好(当所有诺言得到解决后,它会在约25秒后写成“完成!”)。

我是流媒体的新手,所以如果我以错误的方式处理这个问题,请随时打击我;-)真希望我能得到一些指导!

看来我试图一次完成太多请求。 现在,使用async.eachLimit将我的代码限制为最多50个并发请求,这对我而言是执行时间,内存消耗和稳定性之间的权衡(所有下载每次都完成!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM