0

私は最近、顧客向けのマルチファイル アップロード HTTP ページの作業を開始しました。

彼はすべてを HTTP、Javascript、および HTML で行い、大きなファイル (それぞれ最大 800 メガバイト) を送信できる必要があり、アップロード用のプログレスバーも必要としています。Flash や Silverlight は受け入れられないオプションであり、最後に、サードパーティ コンポーネントも受け入れられません。

今、私は全体の概念を理解しています。iframeあなたは(ewww、私はi-wordと言いました-私は知っています)を持つメインページを持っています。これは、ファイルのアップロードを含む をiframe指します。formこのように、これformが送信されると、訪問者がいる元のページはリロードされず、元のページで AJAX を実行し、転送の進行状況を常に確認できます。

最初の試み

以下に示すように、アクション メソッドのパラメーターとしてファイルを直接宣言することで、MVC でファイルを取得することから始めました。

public ActionResult UploadFile(HttpPostedFile upload) {
    ...
}

しかし、MVC が私に与えてくれたこの助けと同じくらい、変数のInputStreamプロパティもSaveAs(...)メソッドも私を助けてくれませんでした。upload

BeginExecute および GetBufferedInputStream

すぐに、.NET 4.0 で導入された というメソッドを見つけましたHttpRequest.GetBufferedInputStream()。特にこの方法により、ファイル ストリームを受信し、増分的かつ非同期的に読み取ることができました。

このように、特定の URL がトリガーされたときに、コントローラーのメソッドを上書きし、BeginExecuteそこに読み取り機能を配置しました。

protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
{
    if (requestContext.HttpContext.Request.Url.AbsolutePath.StartsWith("/Home/UploadFile"))
    {
        //we're doing a file upload
        var streamSource = requestContext.HttpContext.Request.GetBufferedInputStream();

        //read from stream, write to file
    }
}

これはすべて正常に機能します... AJAXが入って中断しない場合。AJAX スクリプトを実行している場合 (iframeアップロードが開始されてから 10 秒後に実行されます)、(リクエストを行うとGET) そのリクエストは、別のアクションであっても、ファイルを読み取っているストリームを中断します。また、別のコントローラー上にある場合でも。

私が受け取っているエラーは次のとおりです。

基になる要求が完了したため、クライアントは切断されました。利用可能な HttpContext はなくなりました。

これについて何ができますか?

4

1 に答える 1

1

ASP .NET Ajax File Uploadを見てください。これにより、GetBufferlessInputStream と GetBufferedInputStream がどのように機能するか、およびそれらを「ajax」ファイルのアップロードに使用する方法が明確になりますが、多くのコードを変更する必要があります。

.NET 4.5 を使用している場合は、GetBufferedInputStream を使用するプロジェクトの更新バージョンがまもなく提供され、使いやすくなります。同じリンクで更新を確認できます。

于 2013-01-11T22:45:49.023 に答える