ユーザーがファイルをアップロードできるページを含む ASP.NET MVC アプリケーションがあります。ファイルは数百メガバイトになります。
クライアント側で FineUploader を使用しています。ブラウザがサポートしている場合は FileAPI/XHR を使用します。
したがって、サーバー側で評価する必要がありますRequest.Files.Count > 1
。もしtrue
、これが昔ながらのアップロードで、他のRequest.Files[0].InputStream.CopyTo(myFileStream)
方法でファイルを保存しますRequest.InputStreawm.CopyTo(myFileStream)
。
これを行う実際のコードの一部を次に示します: https://github.com/ronnieoverby/file-uploader/blob/master/server/ASP.NET%20MVC%20C%23/FineUpload.cs
これはすべて正常に動作しますが、私のテストでは、ファイル全体がアップロードされるまで ASP.NET MVC コントローラー アクションも HttpHandler も処理を開始しないことに気付きました。 Web サーバーの RAM の
私はこれを見つけました:ASP.NET MVCへの大きなファイルのアップロードのストリーミングは有望に聞こえますが、コードが彼のアプリケーションのどこにあるのか本当にわかりません。
問題は、アップロードがまだ ASP.NET で行われている間に、アップロードされたファイルをディスクにストリーミングする方法です。
アップデート
今までは理解できなかった重要な詳細が見えてきました。HttpPostedFileドキュメントから:
デフォルトでは、フォーム フィールドやアップロードされたファイルなど、256 KB を超えるすべてのリクエストは、サーバー メモリに保持されるのではなく、ディスクにバッファリングされます。
これで、大規模なアップロード中に Web サーバーの RAM 使用率が急上昇する可能性があるという懸念に対処できます。ただし、まだ問題があります。ファイルが Web サーバーに完全に転送された後、サーバーはファイルを最終的な宛先に移動するために時間を費やさなければなりません。ファイル システム操作がコピーの場合 (コピー先が別の物理ディスク上にある場合に保証されます)、応答が不必要に遅延します。
正直なところ、アップロード ハンドラ/アクションの応答タイムアウトを増やすことで、おそらくこれに対処できます。ただし、バイトを宛先に直接ストリーミングするとよいでしょう。