0

この関数を使用して、ファイルタイプの2つの入力コントロールをループしています。

protected void btnUpload_Click(object sender, EventArgs e)
{
    HttpFileCollection hfc = Request.Files;
    int numFiles = hfc.Count;
    for (int i = 0; i < hfc.Count; i++)
    {
        HttpPostedFile hpf = hfc[i];
        string FilePath = hpf.FileName;
        CreateProgress(FilePath, i + 1, numFiles);
        Thread.Sleep(2000);
    }
}

この段階では、ファイルに対して何もしていません。各ファイルをアップロードした後、ブラウザに何かを書き込んで、ファイルがアップロードされていることをユーザーに知らせることができることを証明したいと思います。関数CreateProgressは次のとおりです。

public void CreateProgress(string FilePath, int i, int numFiles)

{
    StringBuilder sbProgress = new StringBuilder();
    string strTableId = "mainTable" + i;
    sbProgress.Append("<html><head><link rel=\"StyleSheet\" href=\"stylesheet/StyleSheet1.css\" type=\"text/css\" /></head><body>");
    sbProgress.Append("<table id=\"" + strTableId + "\" border=\"0\">");
    sbProgress.Append("<tr>"); 
    sbProgress.Append("<td>");
    sbProgress.Append("<p class=\"filey\">Uploading " + FilePath + " ..... file " + i.ToString() + " of " + numFiles.ToString() + "</p>");
    sbProgress.Append("</td>");
    sbProgress.Append("<td style=\"display:none\">");
    sbProgress.Append("</td>");
    sbProgress.Append("</tr>");
    sbProgress.Append("</table>");
    sbProgress.Append("</body></html>");
    HttpContext.Current.Response.Write(sbProgress.ToString());
    HttpContext.Current.Response.Flush();
}

上記のコードは毎回完全に機能します。クリックしてファイルをアップロードすると、画面に「Uploading SomeFile.txt ... file 1 of 2」が2秒間表示され、次に「Uploading SomeOtherFile.txt ... file 2of2」が2秒間表示されます。

ただし、StringBuilderを構築するコードで、1つの行と2つのセルを持つテーブルを構築していることがわかります。行の2番目のセルは必要ないか使用しませんが、このように3行をコメントアウトして削除すると...

    public void CreateProgress(string FilePath, int i, int numFiles)

{
    StringBuilder sbProgress = new StringBuilder();
    string strTableId = "mainTable" + i;
    sbProgress.Append("<html><head><link rel=\"StyleSheet\" href=\"stylesheet/StyleSheet1.css\" type=\"text/css\" /></head><body>");
    sbProgress.Append("<table id=\"" + strTableId + "\" border=\"0\">");
    sbProgress.Append("<tr>"); 
    sbProgress.Append("<td>");
    sbProgress.Append("<p class=\"filey\">Uploading " + FilePath + " ..... file " + i.ToString() + " of " + numFiles.ToString() + "</p>");
    //sbProgress.Append("</td>");
    //sbProgress.Append("<td style=\"display:none\">");
    //sbProgress.Append("</td>");
    sbProgress.Append("</tr>");
    sbProgress.Append("</table>");
    sbProgress.Append("</body></html>");
    HttpContext.Current.Response.Write(sbProgress.ToString());
    HttpContext.Current.Response.Flush();
}

...次に、[アップロード]ボタンをクリックすると、最初は何も起こらず、2番目のメッセージが画面に表示されます(ファイル2/2のアップロード)。行の2番目のセルが作成されないように、いったいなぜ3行をコメントアウトすると、正しく機能しなくなるのでしょうか。

実際、3行を残して、tdタグから「style = "display:none"」を削除すると、正しく機能しません。style = "display:none"を元に戻すと、正常に機能します。

実際、私は実際にはテーブルを作成したくありません。私はロットを削除して、単にこれを実行しようとしました:

    StringBuilder sbProgress = new StringBuilder();
    sbProgress.Append("<html><head><link rel=\"StyleSheet\" href=\"stylesheet/StyleSheet1.css\" type=\"text/css\" /></head><body>");
    sbProgress.Append("<p class=\"filey\">Uploading " + FilePath + " ..... file " + i.ToString() + " of " + numFiles.ToString() + "</p>");
    sbProgress.Append("</body></html>");
    HttpContext.Current.Response.Write(sbProgress.ToString());
    HttpContext.Current.Response.Flush();
}

しかし、これも機能しません。最初のメッセージ「Uploadingfile1of 2」は表示されませんが、2番目のメッセージ(「Uploadingfile 2 of2」)は表示されます。

何か案は?タクシーの運転手になることを考えています。

4

2 に答える 2

2

基本的に、ここではHTTPの要求/応答の性質に逆らって取り組んでいます。最初のリクエストで何らかの「操作識別子」を生成し、それをクライアントに提供する方がよいでしょう。次に、Javascriptを記述して操作の進行状況をポーリングし、毎回操作識別子を渡します。そうすれば、ブラウザーがまだ完了していない応答を処理する方法に依存するのではなく、一連の完全な要求/応答のペアを持つことができます。

(通常の時間指定ポーリングの代わりにロングポーリングを使用して、各部分が完了したときにのみ戻ることができますが、基本的なマルチリクエストの設定は同じです。)

于 2012-10-08T22:43:13.987 に答える
0

実際に不正なマークアップを作成しました

//sbProgress.Append("</td>");
//sbProgress.Append("<td style=\"display:none\">");
//sbProgress.Append("</td>");

最後の 2 行をコメントする必要があります。最初の行は、その上の終了タグにする必要があります。

になるはずだった

sbProgress.Append("<p class=\"filey\">Uploading " + FilePath + " ..... file " + i.ToString() + " of " + numFiles.ToString() + "</p>");
sbProgress.Append("</td>");
//sbProgress.Append("<td style=\"display:none\">");
//sbProgress.Append("</td>");
sbProgress.Append("</tr>");
于 2012-10-08T23:13:31.017 に答える