使用请求从节点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。 我非常想避免这种情况。
任何想法如何让它的工作?