从nodejs请求到s3的stream响应
你如何使用请求下载一个文件的内容,并直接使用aws-sdk作为节点将其传输到s3?
下面的代码给我的Object #<Request> has no method 'read'
,这使得它看起来像请求不会返回一个可读的stream…
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); }); } }); });
根据aws-sdk docs Body
需要是一个ReadableStream
对象。
我在这里做错了什么?
这可以使用s3-upload-stream模块,但是我宁愿限制我的依赖关系。
如果您手动侦听响应stream,则要使用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); }); } }); });
由于我的问题与@JoshSantangelo(S3上的零字节文件)有相同的问题:request@2.60.0和aws-sdk@2.1.43,让我添加一个替代解决scheme,使用Node自己的http
模块(警告:真实的简化代码生活项目,并没有单独testing):
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); }); }
据我所知,问题是request
不完全支持当前的节点streamAPI,而aws-sdk
依赖于它。
参考文献:
- 请求有关
readable
事件不正确的问题 - 请求中的“新stream”支持的一般问题
- 在aws-sdk中使用
readable
事件
- 如何在NodeJS上使用S3 SSE C(服务器端encryption与客户端提供的密钥)
- 用NodeJS检索远程文件进行存储?
- 无法使用aws-sdk在nodejs中上传图像
- AWS S3使用docker容器parsingURI错误
- 如何使用getSignedUrl()将Node.js fluent-ffmpeg屏幕截图的目标文件夹设置为您的AWS S3存储桶?
- AWS尝试将消息发送给我的S3 Bucket(Node.js)
- 使用NodeJS和Multer将图像上传到S3。 如何上传整个文件onFileUploadComplete
- 上传S3 knox节点js(签名不匹配)
- 将文件从公共S3存储桶复制到专用S3存储桶的最佳方法