私は最近、顧客向けのマルチファイル アップロード 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 はなくなりました。
これについて何ができますか?