大きなファイル (~6MB) を ASP .NET MVC2 アプリケーションにアップロードするために使用される次のコードがあります。ファイルがアップロードされた後、コントローラーから応答が返されるまでに 5 分かかる場合があります。
この間、IE9 は処理がまだ完了していないという兆候を示しません。つまり、ユーザーは他のファイルを選択して再投稿できます。
操作が完了していないことをユーザーにどのように通知し、古いファイルの処理が完了するまで送信ボタンを無効にしますか?
<% using (Html.BeginForm("InvoiceImport", "Grid",
FormMethod.Post, new { enctype = "multipart/form-data" }))
{%>
<input name="uploadFile" type="file" />
<input type="submit" name='invoice' value='Read'/>
<%} %>
コントローラ:
[AcceptVerbs(HttpVerbs.Post)]
[Authorize]
ActionResult ImportFromFile(HttpPostedFileBase uploadFile)
{
Server.ScriptTimeout = 30 * 60;
var res = ImportFromFile(uploadFile.InputStream); // takes lot of time
TempData["Message"] = uploadFile.FileName + " Readed records " + res;
return RedirectToAction("Complete");
}
アップデート
最も重要な問題は、送信の重複を防ぐことだと思います。送信の重複を防ぐために以下のコードを試しましたが、理由は不明ですが、送信ボタンを 2 回目に押すと、Session["Upload"] が null になります。重複送信を防ぐには?
View added
<% if (TempData["Message"]!=null) { %>
setTimeout( function() {
showMessage ( '<%= TempData["Message"] as string %>');
}, 300 );
<% } %>
Controller
ActionResult ImportFromFile(HttpPostedFileBase uploadFile)
{
if (Session["Upload"] != null)
{
// todo: why this point is never reached ?
TempData["Message"] = Session["Upload"] + " Please wait file is being processed";
return View();
}
Session.Add("Upload", uploadFile.FileName);
Server.ScriptTimeout = 30 * 60;
ImportFromFile(uploadFile.InputStream);
TempData["Message"] = uploadFile.FileName + " completed";
Session.Remove("Upload");
return RedirectToAction("Complete");
}