【问题标题】:save incoming file from s3 w/nodejs & knox?保存来自 s3 w/nodejs & knox 的传入文件?
【发布时间】:2011-07-07 13:14:44
【问题描述】:

这可能是非常基本的,因为文档将其省略...来自 knox 文档:

“下面是我们刚刚推送到 s3 的文件的一个示例 GET 请求,并简单地输出响应状态代码、标头和正文。”

client.get('/test/Readme.md').on('response', function(res){
  console.log(res.statusCode);
  console.log(res.headers);
  res.setEncoding('utf8');
  res.on('data', function(chunk){
    console.log(chunk);
  });
}).end();

很简单,但是如何将传入的数据保存为本地文件?新的 BufferList() 还是什么?

我正在尝试构建一个“即时”图像大小调整服务,该服务从 s3 或云端加载图像并根据请求返回它们的大小。然后浏览器缓存大小的图像,而不是直接来自 s3 的完整图像。当然,我首先需要这个基本的工作!有什么想法吗?

谢谢大家!

【问题讨论】:

    标签: javascript node.js amazon-s3 serverside-javascript


    【解决方案1】:

    看起来 knox 不支持流 API,因此您不能使用 stream.pipe() 并获得适当的背压。但是,您的磁盘可能会比 S3 更快,因此这可能无关紧要。

    在“响应”回调中,使用var outstream = fs.createWriteStream(filename); 从文件系统模块打开一个可写流。在“数据”回调中,调用outstream.write(chunk); 希望有一个“结束”回调,您也可以使用关闭写入流。

    【讨论】:

      【解决方案2】:

      作为上述回答的替代方法,您可以将传入的文件保存到缓冲区,如下所示:

      var buffer = '';
      client.get('/test/Readme.md').on('response', function(res){
      
        res.setEncoding('utf8');
      
        res.on('data', function(chunk){
          buffer += chunk;
        });
      
        res.on('end', function(){
          // do something with the buffer such as save it to file, 
          // or directly resize the image here.
          // eg. save to file:
          fs.writeFile('downloaded_readme.md', buffer, 'utf8', function (err) {
          });
        });
      
      }).end();
      

      【讨论】:

      • 在这两个地方将 'utf-8' 设置为 'binary' 对我来说适用于图像。
      • 是的,询问缓冲区是否存在于内存中 - 仅适用于“小”文件
      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 2013-11-21
      • 2011-11-27
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多