0

我正在使用此函数循环两个文件类型的输入控件。

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();
}

上面的代码每次都能完美运行。我点击上传文件并在屏幕上显示“上传 SomeFile.txt ... 文件 1 of 2” 2 秒,然后“上传 SomeOtherFile.txt ... 文件 2 of 2” 2 秒。

但是,您将在构建 StringBuilder 的代码中看到我正在构建一个包含一行和两个单元格的表。我不需要或使用该行中的第二个单元格,但是如果我通过注释掉这样的三行来删除它...

    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 of 2)。为什么在地球上注释掉三行以便不创建行中的第二个单元格会导致它停止正常工作?

事实上,如果我保留 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();
}

但这也不起作用。第一条消息“上传文件 1 的 2”没有出现,但第二条消息(“上传文件 2 的 2”)确实出现。

有任何想法吗?我想成为一名出租车司机。

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>");

您应该已经注释了最后两行。第一行应该是上面它的结束标记。

本来应该

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 回答