使用Node.js
,我正在尝试上传一个大文件(700MB~1GB),作为对POST
请求(使用request)的响应,我的S3桶。
使用aws-sdk进行Javascript iv尝试了2种方法,但每种方法都有不同的问题:
方法 1 - 尝试在s3.upload()
事件中调用response
函数:
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()
被调用一次。该文件在存储桶中创建,但没有数据(零字节)。
方法 2 - 尝试在s3.upload()
事件中调用data
函数:
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');
}
}
结果:每次发生s3.upload()
事件时都会调用 data
。该文件在存储桶中创建,但每次发出事件时,新数据都会覆盖旧数据。最后,只有最后发出的数据(7kb~10kb)。
此外,在调用resolve()
后,s3.upload()
仍会被多次调用。
注意:
1)该函数返回Promise
,因为我的整个过程是同步的。
2)这两种方法都取自Stream response from nodejs request to s3和Piping from request.js to s3.upload results in a zero byte file
的答案3)第三种方法是流式传输到我服务器上的本地文件,然后才上传到s3。我非常想避免这种情况。
关于如何让它发挥作用的任何想法?