Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:使用request和knox将远程文件上载到S3_Javascript_Node.js_Amazon S3 - Fatal编程技术网

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

Javascript NodeJS:使用request和knox将远程文件上载到S3,javascript,node.js,amazon-s3,Javascript,Node.js,Amazon S3,我试图设计一种方法,使用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) {

我试图设计一种方法,使用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);
        }
      }); 
    });
  }
});
这不起作用,因为它在停止之前下载了大约652字节的4kb文件。奇怪的是,如果我不提供对fs.writeFile()的回调,它会在本地下载整个4kb


实现这一目标的最佳方式是什么

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

更新:我似乎在s3方面遇到了一些问题,下面的代码可以正常工作——我确实改变了一件事,您需要将
编码
指定为
来请求,这样您就可以得到一个
缓冲区
。否则,二进制数据将无法很好地工作

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
方法。

非常好。我确实不得不更改“content type”和“content length”的大小写,因为似乎S3或Knox对它很敏感。直到我犯了403个错误。哎呀,实际上我的测试程序中有这个错误。以上编辑。谢谢。我也在用这个。但我得到403状态码。。。。url似乎也不完全正确。“来自S3的响应,状态:403 url:\static\images\thumbnail\abcd.jpg”windows中的路径似乎有问题。使用来自的解决方法更正了它。但我还是得到了403。谢谢你的提问。我正要问同样的问题,我在这里也得到了答案。