2017-09-10 10 views
0

私は、Express v4.15.4でmulter v1.3.0を使用しています。アップロードファイルのサイズを完全にアップロードせずに制限できますか?

私は制限が働いていると思ういけない

この場合
multer({ 
    storage: storage, 
    limits: {fileSize: 1*1000*50, files:1}, 
    fileFilter: function (req, file, cb) { 
     if (_.indexOf(['image/jpeg', 'image/png'], file.mimetype) == -1) 
      cb(null, false); 
     else 
      cb(null, true) 
    } 
}); 
  • 以下のようにファイルサイズの制限を使用していました。原因: LIMIT_FILE_SIZEエラー。

  • fileFilterを削除すると、LIMIT_FILE_SIZEエラーが表示されます。

  • 最初に、ファイル全体がアップロードされるのは&で、fileSizeがチェックされています。

1GBのファイルをアップロードしてから1MBの容量を確認するのはうまくいかない。 ファイルサイズの上限を超えてアップロードを途中で停止する方法があるかどうかを知りたいのですが。私はContent-Lengthに頼りたくはありません。

+0

は1に 'fileSize'を変更し、私は – turmuka

+0

@turmuka同じことを知らせて、再度お試ししてみてください。私は33MBのファイルで、13581.00ミリ秒後にテストしました。エラー:ファイルが大きすぎます。 –

+0

最大ファイルサイズを「250000」にしようとしました。私は間違った計算をしました。それはファイルサイズに達する – turmuka

答えて

0

multerおよびbusboyソースを調べると、データサイズが稼働中の合計として計算され、fileSizeに達するとすぐにストリームの読み取りが停止しているように見えます。ここにコードを参照してください:

https://github.com/mscdex/busboy/blob/8f6752507491c0c9b01198fca626a9fe6f578092/lib/types/multipart.js#L216

1ギガバイトがアップロードされるかもしれないが、それはどこにも保存されるべきではありませんので。

アップロードを続行しないようにしたい場合は、自分で実験していませんが、ソケットを閉じる必要があると思います。私はリクエストがまだデータをアップロードしようとしている間にきれいに応答する方法を知らない。

関連:

YES or NO: Can a server send an HTTP response, while still uploading the file from the correlative HTTP request?

+0

はい1GBファイルは保存されませんが、バッファはメモリを食べます。はいソケットを閉じようとしています –

+0

テストのアップロード中にメモリ消費量に測定可能な変化はありませんでした(私はテストのために2つの物理マシンを使い、 'localhost'では使用しませんでした)。もう少し掘り下げた後、 'busboy'が' limit'イベントを直ちに出している間、 'multer'のハンドラはファイルのアップロードが完了するまでエラーを引き起こさないので、接続を閉じるためにコードをフックするのは難しいようです。 'busboy'を直接使うことができるはずです。 nginxのようなWebサーバーを経由すると、悪意のあるユーザーから保護するためのより良い方法が提供されるかもしれませんが、誰かがあなたに厄介なリクエストを発したい場合、それらを止めることは難しいでしょう。 – skirtle

+0

プロキシとしてnginxまたはapacheを使用するようにアドバイスしていますか?アップロードサイズが制限を超えた場合、ファイル全体をアップロードしませんか? –

関連する問題