2014-03-29 17 views
1

我的环境:Windows 8.1,0.10.0的NodeJS要求2.30.0的NodeJS - 上传使用fs.createReadStream,requestjs,流媒体和AWS S3 presigned URL抛出错误

这是一个基于亚马逊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像下面有史以来错误ything的工作只是罚款

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

注意我也跟着流例如这里https://github.com/mikeal/request几乎一字不差。

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

回答

1

这主要是亚马逊API的问题,而不是您的代码。将文件上传到Amazon需要设置Content-Length标题。在您的流示例中,长度未知,因此Amazon正在放弃连接。在第二个示例中,request知道缓冲区的长度并为您设置Content-Length

如果因为文件很大而将文件全部加载到RAM中,因此您需要使用亚马逊的多部分上传API。如果你是流媒体,但文件很小,那么我可能坚持readFile方法。

+0

感谢您的解释。是否有可能与流媒体结合使用亚马逊多部分上传API。我对此很陌生,只是想了解是否可行,然后再投入时间。 – Newbie

+0

@Newbie你也可以使用流媒体,你只需要先查看文件的大小并设置适当的长度。 – loganfsmyth