NodeJS:使用请求和knox将远程file upload到S3

我试图devise一种方法来上传一个文件从一个URL到S3使用请求和Knox。 目前,我的代码如下所示:

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()的callback,它将在本地下载整个4kb。

完成这个的最好方法是什么?

在这里有一些关于Stackoverflow的问题,但我似乎无法find一个解决您的问题。 下面的解决scheme应该可以工作,但是我现在无法让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); } }); 

注意:使用这个解决scheme,您不必将文件缓冲到磁盘 – 这就是为什么我select使用knox客户端的低层put方法。