C# ASP.NET 2.0中的文件上载进度条

C# ASP.NET 2.0中的文件上载进度条,c#,asp.net,upload,progress,C#,Asp.net,Upload,Progress,我在我的.NET网站上上传了一个文件。我使用FileUpload.NET控件进行上传,并将表单的目标设置为隐藏的iframe。我使用客户端脚本提交表单,然后在页面上显示进度条,它向同一服务器上的ashx文件发出AJAX请求,并每秒更新进度条 下面是文件上传时的部分代码- string fileString = StringGenerator.GenerateString(8); System.IO.Stream fileStream = System.IO.File.Create

我在我的.NET网站上上传了一个文件。我使用FileUpload.NET控件进行上传,并将表单的目标设置为隐藏的iframe。我使用客户端脚本提交表单,然后在页面上显示进度条,它向同一服务器上的ashx文件发出AJAX请求,并每秒更新进度条

下面是文件上传时的部分代码-

    string fileString = StringGenerator.GenerateString(8);
    System.IO.Stream fileStream = System.IO.File.Create(fileRoot+ fileString + ".mp3");
    System.IO.Stream inputStream = fileUpload.PostedFile.InputStream;
    byte[] buffer = new byte[256];
    int read;
    if(StaticProgress.Progress.ContainsKey(trackId)) StaticProgress.Progress[trackId] = 0d;
    else StaticProgress.Progress.Add(trackId, 0d);
    int totalRead = 0;
    long length = inputStream.Length;
    while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        totalRead += read;
        fileStream.Write(buffer, 0, read);
        StaticProgress.Progress[trackId] = (double)totalRead / (double)length;
    }
Progress是一个返回静态字典的属性。 下面是ashx文件中的代码,用于获取

    context.Response.ContentType = "text/javascript";
    int id;
    if(!int.TryParse(context.Request.QueryString["id"], out id) || !StaticProgress.Progress.ContainsKey(id))
        context.Response.Write("{\"error\":\"ID not found\"}");
    else
        context.Response.Write("{\"id\":\"" + id + "\",\"decimal\":" + StaticProgress.Progress[id] + "}");
在这里,当文件上传时,我总是“找不到ID”,但当文件上传完成后,我得到一个成功的-小数点:1


在此之前,我尝试过使用会话变量,得到了相同的结果。我尝试使用公共静态(线程安全?)字典,但得到了相同的结果。以前有人遇到过这样的事情吗?在完全接收到客户端请求之前,代码不会执行吗?

标准文件上载控件不提供任何进度功能-在服务器完全接收到文件之前,它不会接收文件。当您在.PostedFile上打开流时,该文件已完全上载


我们讨论了许多更好的上传解决方案。

谢谢,我会研究它们。我以前在搜索中看到过这个页面,但是没有人真正解释过标准的文件上传控件不允许我读取输入流,直到它全部被接收。所以我试着自己做(我喜欢挑战)。