我的.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。
我之前尝试过使用会话变量并获得相同的结果。我试过使用公共静态(线程安全?)字典,但我得到了相同的结果。以前有人遇到过这样的事吗?在完全收到客户端请求之前,代码是否仍然执行?
答案 0 :(得分:1)
标准文件上传控件不提供进度功能 - 在服务器完全接收文件之前,它不会接收文件。当您在.PostedFile上打开流时,该文件已完全上传。
有许多更好的解决方案可以上传here。