【问题标题】:How do I stream a file from NodeJS to Amazon S3, using Knox?如何使用 Knox 将文件从 NodeJS 流式传输到 Amazon S3?
【发布时间】:2014-02-07 21:51:28
【问题描述】:

我对 NodeJS 中的流非常陌生 - 基本上对它们一无所知 - 我正在尝试让 Amazon S3 的 KnoxJS 客户端从 HTTP GET 流式传输文件。

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.getputStream 之外,它实际上并没有做任何事情。

那么我从这里去哪里呢?有人可以帮我完成此代码,以便我可以将文件从 HTTP GET 流式传输到 S3 上的存储桶吗?

【问题讨论】:

  • 同意,这是一个常见的请求,围绕这个任务放置一些文档会很有帮助。相信您确实需要预先知道文件大小(如上所示)才能进行流式传输 - 这对适用性施加了一些限制。 @Derick Bailey,如果你能做到这一点 - 你能发布你的解决方案 - 将节省其他人的时间。

标签: node.js amazon-web-services amazon-s3 streaming knox-amazon-s3-client


【解决方案1】:

一旦你进入这个回调:

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

来自 google 的响应已经流式传输到 S3(这就是 knox 的 putStream 为您所做的),err, res 是 S3 的响应,所以除了检查错误和类似的东西之外,您不需要做任何其他事情console.log("Upload done") 如果这是命令行 sn-p。他们在此处的文档说,如果整个 sn-p 是在浏览器和 node.js Web 应用程序之间的 HTTP req/res 交互的上下文中,那么您可以决定要将图像通过管道传回浏览器好吧,你可以这样做(至少在理论上)。我认为文档对此有点困惑,但这是我的解释。

【讨论】:

  • 这对我来说似乎不对。在我的“真实”代码中,我正在流式传输几百兆的文件,并且完成时间不到 2 秒。我的电脑上网速度很慢,需要一两分钟才能上传 30 兆,这不可能是正确的,但在调用此代码时会立即完成并可用。显然我做错了什么,或者流媒体不是这样工作的。
  • 是的,听起来您认为您的代码在所有上传都已开始并且没有等待它们全部完成时“完成”。很难提供基于理论 sn-ps 的指导。你能提取一个工作的 .js 命令行程序吗?
  • 我如何等待他们完成?上面发布的代码是我开始的,我不知道从那里去哪里。
  • 所以当你想做一批东西的时候,就碰到了节点异步流控问题。您可以使用async.parallel 之类的东西,它将并行执行所有操作,并让您知道它们何时全部完成,或者在诸如 Q 之类的 Promise 库中的等价物。 async.eachLimit 也很适合让 N 人同时上传。
  • 看起来这最终是正确的。我原来的 HTTP GET 请求有一个重定向。使用“follow-redirects”npm 模块来完成这项工作,它现在可以正确地流式传输我的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2015-03-17
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多