读书人

MVC Controller处理文件下传ashx获取

发布时间: 2012-12-17 09:31:40 作者: rapoo

MVC Controller处理文件上传,ashx获取上传信息。必须等Controller存储完后才能读取。。求解
我在一个MVC的controller中处理文件上传,其中进度信息保存在session中,然后通过AJAX请求一个ashx来读取session进度。但是AJAX的请求发到服务端后,必须要等controller的文件保存完毕才能读取session的值。此时session里记录的文件进度已经是100%了。AJAX返回的数据一下全部都是100%,没能达到监听进度的木的,求达人详解。下面是相关代码

controller处理文件部分


FileProgress progress = new FileProgress();
int length = ulf.FileLength;
progress.TotalSize = length;
byte[] FileArray = new Byte[length];
int index = 0;
byte[] b = new byte[5000];
int getByteSize = ulf.FileData.Read(b, 0, b.Length);
while (getByteSize > 0)
{
Array.Copy(b, 0, FileArray, index, getByteSize);
index += getByteSize;
Thread.Sleep(100);
progress.CurrSize = index;
HttpContext.Current.Session[file_key] = progress;
getByteSize = ulf.FileData.Read(b, 0, b.Length);
}

FileAttachment attach = new FileAttachment();
attach.FieldName = ulf.ConditionField;
attach.FileData = FileArray;
attach.FileLength = length;
attach.FileName = ulf.FileName;
attach.FormId = new Guid(ulf.FormId);
attach.InstanceId = new Guid(ulf.InstanceId);

ashx读取session部分

public class FileUploadProgressHandler : IHttpHandler,IRequiresSessionState
{
Double Percentage = 0.00;
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/json";

FileProgress progress = (FileProgress)context.Session[context.Request["sessionId"]];//request. .Cache[guid] as DownloadingFileInfo;




if (progress!=null&&progress.TotalSize > 0)
{
Percentage = progress.CurrSize / progress.TotalSize;
}
String result = "{'sucress':'true','data':'" + Percentage.ToString() + "'}";
context.Response.Write(result);


}

public bool IsReusable
{
get
{
return false;
}
}
}


Ajax请求部分

startUpload: function (queue) {
var me = this;
var sessionId = new Date().getTime();
this.params.sessionId = sessionId;
me.task = window.setInterval(function () {
me.getUploadProgress({}, me.progressUrl, { sessionId: sessionId });
}, 10);
for (var i = 0; i < queue.items.length; i++) {
var form = queue.items[i];
form.getForm().submit({
url: this.url,
params: this.params,
isUpload: true
});


}

},
getUploadProgress: function (progressBar, url, params) {
var me = this;

Ext.Ajax.request({
url: url,
params: params,
method: 'post',


success: function (response) {
var rs = Ext.decode(response.responseText);
console.log(rs.data)
if (rs.data == 1) {
window.clearInterval(me.task);
}
}
});

}


[最优解释]
引用:
我在一个MVC的controller中处理文件上传,其中进度信息保存在session中,然后通过AJAX请求一个ashx来读取session进度。但是AJAX的请求发到服务端后,必须要等controller的文件保存完毕才能读取session的值。此时session里记录的文件进度已经是100%了。AJAX返回的数据一下全部都是100%,没能达到监听进度的木的,求达人详解……

你换个设计思路好不好, 在这里用session有问题。你在controller的接收文件的action, 就把session给锁住了

根据微软的文档:
但是,如果这两个并发请求是针对同一会话的(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求将只在第一个请求完成之后执行
http://msdn.microsoft.com/zh-cn/library/ms178581(v=vs.100).aspx

另外上传文件的进度可以在客户端作,下面是一个演示,jquery的一个插件,你看看源码:
http://jquery.malsup.com/form/progress.html
[其他解释]
http://www.codeproject.com/Tips/402588/Using-AJAX-asynchronously-with-progress-bar-and-st
[其他解释]
昨晚也猜到有可能是这个问题,后来用cache 解决了此问题,但仍然感谢两位
[其他解释]
昨晚也猜到有可能是这个问题,后来用cache 解决了此问题,但仍然感谢两位
[其他解释]
昨晚也猜到有可能是这个问题,后来用cache 解决了此问题,但仍然感谢两位

读书人网 >asp.net

热点推荐