从nodejs请求到s3的流响应

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依赖于它.

参考文献:

  • 这是唯一对我有用的解决方案.谢谢. (3认同)

msc*_*dex 6

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)

  • 我有同样的问题 - 这个答案很有帮助,但s3上的文件最终是零字节.将相同的请求管道到磁盘会生成有效文件. (7认同)