20

ユーザーがファイルをアップロードできるページを含む 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 サーバーに完全に転送された後、サーバーはファイルを最終的な宛先に移動するために時間を費やさなければなりません。ファイル システム操作がコピーの場合 (コピー先が別の物理ディスク上にある場合に保証されます)、応答が不必要に遅延します。

正直なところ、アップロード ハンドラ/アクションの応答タイムアウトを増やすことで、おそらくこれに対処できます。ただし、バイトを宛先に直接ストリーミングするとよいでしょう。

4

2 に答える 2

6

メソッドを使用してバッファリングすることなく、完全にカスタマイズされた方法でアップロードを処理できます HttpRequest.GetBufferlessInputStream。基本的に、生の受信データにアクセスし、それを自由に使用できます。

生のリクエスト コンテンツをファイルに保存する小さなサンプルを作成しました。

  1. ハンドラーを作成します。

    public class UploadHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            using (var stream = context.Request.GetBufferlessInputStream())
            using (var fileStream = File.Create("c:\\tempfile.txt"))
            {
                stream.CopyTo(fileStream);
            }
        }
        public bool IsReusable { get {  return true; } }
    }
    
  2. Web.config に登録します。

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <handlers>
            <add name="UploadHandler" verb="POST"
                path="/upload"
                type="UploadHandler"
            resourceType="Unspecified"/>
        </handlers>
    </system.webServer>
    
  3. フォームを含むページを作成します。

<form action="/upload" method="post" enctype='multipart/form-data'>
     <input type="file" name="aa" id="aa"/>
     <input type="submit"/>
</form>
于 2012-12-21T04:34:59.103 に答える
1

アップロードとストリーミングが貴重なサーバー リソースを使い果たしている場合は、何らかのクラウドでメディア ファイルをホストすることを検討することをお勧めします。ASP.NET を使用して Rackspace を使用することは可能です。Amazon Cloud API を使用すると、ユーザーはファイルを CDN ネットワークに直接アップロードし、その方法でコンテンツを提供できます。 2 セント稼げると思っていました。いまだにクラウドの使用を選択していない人が多いことに驚かされます。一度 CDN にアクセスすると、二度と戻れなくなります。さらに、ほとんどの CDN では、さまざまな種類の映画をサポートするアップロード コンテナーのストリーミング URL も提供されます。また、ユーザーがアップロードするだけでなく、Web サイトの速度が遅くなることもありません。結果。

于 2012-12-21T13:13:30.353 に答える