2017-04-21 35 views
0

我試圖從提交的表單中上載具有來自不同輸入名稱的多個圖像文件的文件。使用skipper(sails.js)處理具有不同未知輸入字段名稱的中間件中的文件

例如,asumming與文本輸入和文件輸入的多形式,它不實際的組具有相同名稱的所有文件的輸入,例如images[]

<form ...> 
some text inputs... 
<input type='file' name='logo'/> 
<input type='file' name='image-1'/> 
<input type='file' name='image-2'/> 
</form> 

我想創建一個快遞/帆中間件處理上傳,所以我可以直接在我的控制器上訪問它們。

如果我這樣做(假設上req.file該上傳方法()被promisified)

async function(req, res, next){ 
     const maxTimeToBuffer = 9500 
     const dirname = '/some-upload-path' 
     const uploads = [ 
     await req.file('logo').upload(dirname, maxTimeToBuffer) 
     await req.file('image-1').upload(dirname, maxTimeToBuffer) 
     await req.file('image-2').upload(dirname, maxTimeToBuffer) 
     ] 
     // attaching the uploads to the request body ... 
     next() 
    } 

這將引發錯誤: EMAXBUFFER: An Upstream (圖像-1 ) timed out before it was plugged into a receiver. It was still unused after waiting 9500ms. You can configure this timeout by changing the maxTimeToBuffer option.

一點也沒有」無論如何,我將maxTimeToBuffer增加到30000即使在船長模塊本身。

由於試圖以順序方式處理每個文件,無論發生錯誤,只要我知道輸入字段名稱,就可以並行處理它們。

async function(req, res, next){ 
     const maxTimeToBuffer = 9500 
     const dirname = '/some-upload-path' 
     const uploads = await [ 
     req.file('logo').upload(dirname, maxTimeToBuffer) 
     req.file('image-1').upload(dirname, maxTimeToBuffer) 
     req.file('image-2').upload(dirname, maxTimeToBuffer) 
     ] 
     // attaching the uploads to the request body ... 
     next() 
    } 

現在的問題是,我如何在最後一個片段上實現同樣的事情,但事先並不知道輸入字段。這樣

async function(req, res, next){ 
    const maxTimeToBuffer = 9500 
    const dirname = '/some-upload-path' 
    const uploads = await req._fileparser.upstreams 
    // attaching the uploads to the request body ... 
    next() 
} 

的事情的東西是req._fileparser.upstreams被其接收新流和第一形象被完全接收後,只會發生(連續),但如果我等待上行流陣列是完整的每一次更新我也會得到一個超時錯誤。

有沒有解決方法?

我知道有很多東西需要消化,如果您需要進一步澄清,請告訴我。 任何想法表示讚賞

回答

0

好吧,經過很多撞我的頭對着牆我想出了這個。 我們開始運行流而不等待它們,每次添加一個新的流時,我們通過調用upload來運行它,然後如果解析器/表單被設置爲由隊長關閉,那麼我們每隔100ms就會檢查一次間隔,如果這是真的,我們可以安全地等待所有的流,最後我們解決承諾,或者如果在我們拒絕它之前超時觸發。我已經簡化了我的代碼,因爲我正在做很多額外的解析,我希望它可以幫助其他人。

async function(req, res, next){ 
    const maxTimeToBuffer = 9500 
    const dirname = '/some-upload-path' 
    const uploads = await new Promise((resolve, reject)=> { 
     const TIMEOUT = 20000 
     const {upstreams} = req._fileparser 
     const tasks = _.map(upstreams, (stream)=> stream.upload(dirname, maxTimeToBuffer)) 
     // We proxy the original push method, to push to our task list every time a new stream is added 
     upstreams.push = (stream)=> { 
     tasks.push(stream.upload(dirname, maxTimeToBuffer)) 
     Array.prototype.push.call(upstreams, stream) 
     } 
     const startTime = (new Date()).getTime() 
     const intervalId = setInterval(async function(){ 
      if(req._fileparser.closed){ 
       clearInterval(intervalId) 
       fileObjects = await tasks 
       resolve(fileObjects) 
      } 
      else if((new Date()).getTime() - startTime > TIMEOUT){ 
       clearInterval(intervalId) 
       reject(new Error('Timeout triggered before form closed')) 
       , 100)  
      } 
    }) 
    // attaching the uploads to the request body ... 
    next() 
} 

我認爲船長不應該這樣做,並強制這種黑客,所以也許我錯過了一些東西,如果我是,讓我知道。

相關問題