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

时间:2011-05-09 22:36:46

标签: c# asp.net upload progress

我的.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;
    }

StaticProgress.Progress是一个返回静态Dictionary的属性。 以下是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。

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

1 个答案:

答案 0 :(得分:1)

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

有许多更好的解决方案可以上传here