Javascript NodeJS:使用request和knox将远程文件上载到S3
我试图设计一种方法,使用request和knox将文件从url上传到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(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。谢谢你的提问。我正要问同样的问题,我在这里也得到了答案。