2011-05-09 90 views
0

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

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

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是返回一个静态字典的属性。 这里是在ashx的文件,该文件得到我总是“ID未找到”,而该文件被上传,但是当文件上传完毕,我得到一个成功的

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] + "}"); 

这里进步的代码 - 十进制:1.

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

回答

1

标准文件上传控件不提供进度功能 - 只有服务器完全接收文件后才能接收文件。在打开.PostedFile文件流时,文件已经完全上传。

有许多更好的解决方案上传讨论here

+0

谢谢,我会看看他们。我之前在我的搜索中看到过这个页面,但没有人真正解释过,标准文件上传控件将不允许我从输入流中读取,直到全部收到。所以我试图自己做(我喜欢挑战)。 – Connell 2011-05-09 22:54:17