2015-12-15 37 views
1

試圖流上傳使用船長和船長-S3使用此代碼內存緩衝器填滿時I流上傳文件時,雖然通過一個磁盤存儲位置PARAM

image_upload : function (req,res) { 

    // depends on bodyparser:skipper in confing/http.js 

    console.log("Uploading image .. "); 

    req.file('image') 
     .upload({ 
      adapter: require('skipper-s3'), 
      key: KEY, 
      secret: SECRET, 
      bucket: 'mybucket', 
      tmpdir: 'tmp/s3-multiparts' 
     }, function whenDone(err, uploadedFiles) { 
      if (err){ 
       return res.negotiate(err); 
      } else { 
       dict = { 
        files: uploadedFiles, 
        textParams: req.params.all() 
       } 
       return res.ok(dict); 
      } 
     } 

    ); 
}; 

我有2個問題,S3:

首先:當我嘗試上傳一些文件,我可以看到,這個文件緩存在內存中,而不是僅僅緩存到磁盤(路徑添加到選項)。

其實這是一個很大的問題,因爲有許多用戶同時上傳

在我的記憶將填補如此之快:我的應用程序崩潰時上傳比5MBs大,給我這個錯誤

 
events.js:85 
     throw er; // Unhandled 'error' event 
      ^
Error: Request aborted 
    at IncomingMessage.onReqAborted (~Desktop/myApp/node_modules/sails/node_modules/skipper/node_modules/multiparty/index.js:175:17) 
    at IncomingMessage.emit (events.js:104:17) 
    at abortIncoming (_http_server.js:279:11) 
    at Socket.serverSocketCloseListener (_http_server.js:292:5) 
    at Socket.emit (events.js:129:20) 
    at TCP.close (net.js:485:12) 

回答

0

解決方法爲您的第二個問題: 您可以指定要上傳的文件的最大大小。默認值是5 MB。

req.file('some_file').upload({ 
    dirname: 'path to store the file',/* optional. defaults to assets/uploads I guess*/ 
    saveAs: 'new file name', /* optional. default file name */ 
    maxBytes: 5 * 1024 * 1024 //5 MB 
}, function(err, uploadedFiles) { 

}); 

雖然我不確定第一個問題。您不需要在選項中指定tempdir。 Skipper-S3默認將文件寫入<your project root>/.tmp/s3-upload-part-queue以實現上傳目的。我不明白爲什麼內存應該填滿。你能否刪除tempdir並檢查?

+0

感謝您的回答!我嘗試了使用和不使用tmpDir,它沒有區別,它不斷加載/緩衝上傳的文件到內存中 – securecurve

+0

@securcurve從隊長文檔引用,不知道它是否有任何幫助; >緩衝多部分請求的目錄的路徑可以放在頭上。亞馬遜要求發送到其分段上傳API的「部分」的大小至少爲5MB,因此該目錄用於對數據塊進行排隊,直到累積足夠大的有效負載。默認是.tmp/s3-upload-part-queue(從節點進程的當前工作目錄中解析出來,例如你的應用) – MjZac

+0

也許,你可以避免使用'skipper-s3'並將文件寫入磁盤,然後使用' aws-sdk'用於上傳到S3 – MjZac