Node.js 如何使用Knox将文件从NodeJS流式传输到AmazonS3?

Node.js 如何使用Knox将文件从NodeJS流式传输到AmazonS3?,node.js,amazon-web-services,amazon-s3,streaming,knox-amazon-s3-client,Node.js,Amazon Web Services,Amazon S3,Streaming,Knox Amazon S3 Client,我对NodeJS中的流非常陌生——基本上对它们一无所知——我正在尝试让KnoxJS客户端用于amazons3从httpget流式传输文件 Knox github页面上的示例代码显示: http.get('http://google.com/doodle.png', function(res){ var headers = { 'Content-Length': res.headers['content-length'] , 'Content-Type': res.hea

我对NodeJS中的流非常陌生——基本上对它们一无所知——我正在尝试让KnoxJS客户端用于amazons3从httpget流式传输文件

Knox github页面上的示例代码显示:


http.get('http://google.com/doodle.png', function(res){
  var headers = {
      'Content-Length': res.headers['content-length']
    , 'Content-Type': res.headers['content-type']
  };
  client.putStream(res, '/doodle.png', headers, function(err, res){
    // check `err`, then do `res.pipe(..)` or `res.resume()` or whatever.
  });
});
但这显然是不完整的。。。除了为S3打开
http.get
putStream
之外,它实际上什么都做不了


那我该怎么办?有人能帮我完成这段代码吗?这样我就可以从HTTP流式传输一个文件到S3上的bucket?

一旦你进入这个回调:

//check `err`, then do `res.pipe(..)` or `res.resume()` or whatever

google的响应已经被传输到S3(这是knox的
putStream
为您所做的),而
err,res
是S3的响应,因此,如果这是命令行代码段,那么除了检查错误和类似于
console.log(“上传完成”)
的内容之外,您不需要做任何其他事情。他们在这里的文档中说,如果整个代码段都在浏览器和node.js web应用程序之间的HTTP req/res交互上下文中,那么您也可以决定是否要将图像传输回浏览器,您可以这样做(至少在理论上)。我认为医生对此有点困惑,但这是我的解释。

我觉得这不对。在我的“真实”代码中,我正在流式传输几百兆的文件,并且只需要不到2秒的时间就可以完成。我的电脑网速很慢,需要一两分钟才能上传30兆的数据,在调用此代码时,它会立即完成并可用,这是不对的。很明显,我做错了什么,或者流媒体不是这样工作的。是的,这听起来好像你认为你的代码“完成”了,因为上传已经开始,而不是等待它们全部完成。很难根据理论片段提供指导。你能提取一个正常工作的.js命令行程序吗?我如何等待它们完成?上面发布的代码是我的开始,我不知道从那里开始。因此,当你想做一批事情时,你会遇到节点异步流控制问题。您可以使用类似于
async.parallel
的东西,它将并行地完成所有这些操作,并让您知道它们何时完成,或者在promise库(如Q或其他)中的等效操作
async.eachLimit
允许N同时上传也很好。看起来这最终是正确的。我最初的HTTP GET请求有一个重定向。使用“跟随重定向”npm模块来实现这一点,现在它可以正确地流式传输我的文件。同意,这是一个非常常见的请求,在这项任务中放置一些文档会很有帮助。相信您确实需要提前知道文件大小(如上所述)才能进行流式处理-这会对适用性造成一些限制@Derick Bailey如果你能做到这一点-你能发布你的解决方案-将节省其他人的时间。