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

4
我正在想出一种使用 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);
        }
      }); 
    });
  }
});

这不起作用,因为它只下载了4kb文件的约652字节就停止了。奇怪的是,如果我不提供fs.writeFile()的回调函数,它会完整地下载整个4kb文件到本地。

最好的解决方案是什么?


谢谢你的问题。我也正想问同样的问题,现在在这里得到了答案。 - user644745
1个回答

10

在Stackoverflow上有许多关于这个问题的提问,但似乎找不到一个能够回答你的问题。下面的解决方案应该是有效的,但我现在在我的机器上无法让knox正常工作。希望你会更加幸运!

更新:我在这里遇到了一些S3的问题,下面的代码可以工作--我确实改变了一件事情,你需要将encoding指定为null来请求,这样你就可以得到一个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);
  }
});

注意:使用此解决方案,您可以避免将文件缓冲到磁盘中——这就是我选择使用knox客户端的较低级别put方法的原因。


1
非常好。我确实不得不更改“content-type”和“content-length”的大写,因为似乎S3或Knox对此很敏感。在我更改之前,我一直收到403错误。 - James
哎呀,我实际上在我的测试程序中已经有了那个。已在上面进行编辑。谢谢。 - Linus Thiel
我也在使用这个。但是我得到了403状态码... URL似乎也不完全正确。"来自S3的响应,状态:403 URL:http://zzzzzz.s3.amazonaws.com\static\ima ges\thumbnail\abcd.jpg" - user644745
在Windows中似乎存在路径问题。我已经通过https://github.com/LearnBoost/knox/issues/56的解决方法进行了更正。但是仍然出现403错误。 - user644745

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接