nodejs – 使用fs.createReadStream,requestjs,streaming和AWS S3 presigned url上传会引发错误

我的环境:Windows 8.1,NodeJS 0.10.0请求2.30.0

这是我基于Amazon SDK的示例和requestjs的文档尝试的

var params = {Bucket:'myprivateuniquebucket' ,Key:'mykey' ,Expires: 60}; var url = s3.getSignedUrl('putObject', params); fs.createReadStream('pic.png').pipe(request.put(url)); 

这是我得到的错误

 events.js:72 throw er; // Unhandled 'error' event ^ Error: read ECONNRESET at errnoException (net.js:863:11) at TCP.onread (net.js:524:19) 

然而,而不是使用fs.createReadStream当我使用下面的fs.readFile一切工作得很好

  fs.readFile('pic.png', function (err, data) { request( { method: 'PUT' , uri: url , body: data } , function (error, response, body) { } ); }); 

请注意,我几乎逐字跟在https://github.com/mikeal/request这里。

我会很欣赏什么是不正确的指针,因为我想在多个地方使用stream。

这主要是亚马逊API的问题,而不是你的代码。 将file upload到Amazon需要设置Content-Length标题。 在你的stream示例中,长度是未知的,所以Amazon正在丢弃连接。 在第二个示例中, request知道缓冲区的长度,并为您设置Content-Length

如果你是stream媒体,因为文件是巨大的,并加载到内存很难,那么你将需要使用亚马逊的多部分上传API。 如果你是stream媒体,但文件很小,那么我可能坚持readFile方法。