使用请求从节点stream上传到S3的问题

使用Node.js ,我试图上传一个大的文件(700MB〜1GB),作为响应POST请求(使用请求 ),到我的S3桶。

使用aws-sdk for Javascript iv'e尝试了两种方法,但每个都有一个不同的问题:

方法 1 – 尝试在response事件上调用s3.upload()函数:

 const sendRequest = (data) => { try { return new Promise((resolve, reject) => { AWS.config.loadFromPath('./config/awsConfig.json'); let s3 = new AWS.S3({ params:{ Bucket:'myBucket', Key:'path/to/file.csv' } }); request({ method: 'POST', uri: 'https://www.example.com/apiEndpoint', headers: { host: 'example.com', 'content-type': 'application/json' }, body: JSON.stringify(data) }).on('response', (response) => { // 1st approach if (200 == response.statusCode) { s3.upload({ Body: response, ACL: 'public-read', CacheControl: "5184000" }, (err, data) => { //2 months console.log(err, data); }); } }).on('error', (error) => { reject(); }).on('end', () => { resolve(); }); }); } catch (error) { throw new Error('Unable to get and upload file'); } } 

结果: s3.upload()被调用一次。 该文件在桶中创build,但没有数据(零字节)。

方法 2 – 尝试在data事件上调用s3.upload()函数:

  const sendRequest = (data) => { try { return new Promise((resolve, reject) => { AWS.config.loadFromPath('./config/awsConfig.json'); let s3 = new AWS.S3({ params:{ Bucket:'myBucket', Key:'path/to/file.csv' } }); request({ method: 'POST', uri: 'https://www.example.com/apiEndpoint', headers: { host: 'example.com', 'content-type': 'application/json' }, body: JSON.stringify(data) }).on('data', (data) => { // 2nd approach s3.upload({ Body: data, ACL: 'public-read', CacheControl: "5184000" }, (err, data) => { //2 months console.log(err, data); }); }).on('error', (error) => { reject(); }).on('end', () => { resolve(); }); }); } catch (error) { throw new Error('Unable to get and upload file'); } } 

结果:每次有data事件时都调用s3.upload() 。 该文件是在桶中创build的,但每次发生事件时,新数据都将覆盖旧数据。 最后只有最后发射的数据(7kb〜10kb)。 此外,在调用resolve()之后, s3.upload()仍然被多次调用。

笔记:

1)该函数返回一个Promise因为我的整个过程是同步的。

2)两种方法都是从对从nodejs请求到s3的stream应答和从从request.js到 s3的 pipe道应答中取得的.upload产生一个零字节的文件

3)第三种方法是stream到我的服务器上的本地文件,然后上传到S3。 我非常想避免这种情况。

任何想法如何让它的工作?