2014-03-29 35 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