ryn*_*nop 9 amazon-s3 node.js aws-sdk requestjs
你如何使用请求下载文件的内容,并使用节点的aws-sdk直接将其流式传输到s3?
下面的代码给了我Object #<Request> has no method 'read'看起来像请求不返回可读流...
var req = require('request');
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}});
var imageStream = req.get(url)
.on('response', function (response) {
if (200 == response.statusCode) {
//imageStream should be read()able by now right?
s3.upload({Body: imageStream, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months
console.log(err,data);
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
根据aws-sdk文档 Body需要成为一个ReadableStream对象.
我在这做错了什么?
这可以使用s3-upload-stream模块取消,但是我更愿意限制我的依赖关系.
d0g*_*3r7 12
由于我遇到了@JoshSantangelo(S3上的零字节文件)和request@2.60.0以及aws-sdk@2.1.43相同的问题,让我使用Node自己的http模块添加一个替代解决方案(警告:现实生活中的简化代码)项目,未单独测试):
var http = require('http');
function copyToS3(url, key, callback) {
http.get(url, function onResponse(res) {
if (res.statusCode >= 300) {
return callback(new Error('error ' + res.statusCode + ' retrieving ' + url));
}
s3.upload({Key: key, Body: res}, callback);
})
.on('error', function onError(err) {
return callback(err);
});
}
Run Code Online (Sandbox Code Playgroud)
据我所知,问题是request不完全支持当前的Node流API,而aws-sdk依赖于它.
参考文献:
response如果您手动侦听响应流,则希望使用该对象:
var req = require('request');
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}});
var imageStream = req.get(url)
.on('response', function (response) {
if (200 == response.statusCode) {
s3.upload({Body: response, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months
console.log(err,data);
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5285 次 |
| 最近记录: |