NodeJS:使用request和knox将远程文件上传到S3

Jam*_*mes 4 javascript amazon-s3 node.js

我正在设法使用request和knox将文件从url上传到s3.目前,我的代码如下所示:

request(item.productImage, function(err, res, body) {
  if (!err && res.statusCode == 200) {
    fs.writeFile('/tmp/' + filename, body, 'base64', function(err, data){
      if (err) { 
        return console.log(err);
      }

      client.putFile('/tmp/' + filename, '/item/' + item._id + '/' + filename, function(err, res) {
        if (err) {
          return console.log(err);
        }
      }); 
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它在停止之前下载了大约652字节的4kb文件.奇怪的是,如果我不向fs.writeFile()提供回调,它会在本地下载整个4kb.

完成此任务的最佳方法是什么?

Lin*_*iel 10

Stackoverflow上有很多关于这方面的问题,但我似乎无法找到一个能回答你问题的问题.下面的解决方案应该可行,但是,我现在无法在我的机器上使用knox工作.我希望你会更幸运!

更新:我似乎在这里遇到了s3的一些问题,下面的代码有效 - 我确实改变了一件事,你需要指定encodingnull请求,所以你得到了Buffer回来.否则,二进制数据将无法正常工作.

request(item.productImage, {encoding: null}, function(err, res, body) {
  if(!err && res.statusCode == 200) {
    var req = client.put('/item/' + item._id + '/' + filename, {
      'Content-Type': res.headers['content-type'],
      'Content-Length': res.headers['content-length']
    });

    req.on('response', function(res) {
      console.log('response from s3, status:', res.statusCode, 'url:', req.url);
    });

    req.on('error', function(err) {
      console.error('Error uploading to s3:', err);
    });

    req.end(body);
  }
});
Run Code Online (Sandbox Code Playgroud)

注意:使用此解决方案,您可以避免将文件缓冲到磁盘 - 这就是我选择使用putknox客户端的低级方法的原因.