2

大きなファイル (~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");
    }
4

4 に答える 4

0

Asyncronus コントローラーの使用を検討する必要があります。

そうすれば、別のスレッドでアップロードが実行され、ページがロックされなくなります。

次のリンクをご覧ください。

非同期コントローラーの使用

于 2012-07-02T15:33:25.073 に答える