0

異なる入力名の複数の画像ファイルを含む送信フォームからファイルをアップロードしようとしています。

たとえば、テキスト入力とファイル入力を含むマルチパートフォームを想定し、すべてのファイル入力を同じ名前でグループ化することは実際的ではありません。images[]

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

アップロードを処理する Express/Sails ミドルウェアを作成したいので、コントローラーで直接アクセスできます。

私がこれを行う場合(req.file()のアップロード方法が約束されていると仮定)

   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 (images-1 ) timed out before it was plugged into a receiver. It was still unused after waiting 9500ms. You can configure this timeout by changing themaxTimeToBufferoption.

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、新しいストリームを受信するたびに更新され、最初の画像が完全に受信された後にのみ発生します (シーケンシャル) が、upstreams 配列が完了するのを待つと、タイムアウト エラーも発生します。

これに対する回避策はありますか?

さらに説明が必要な場合はお知らせください。どんなアイデアでも大歓迎です

4

1 に答える 1