怎么在asp.net mvc中实现一个带进度条的文件上传功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
实现思路
ajax异步上传文件,且开始上传文件的时候启动轮询来实时获取文件上传进度。保存进度我采用的是memcached缓存,因为项目其他地方也用了的,所以就直接用这个啦。注意:不能使用session来保存进度,因为session是线程安全的不能实时获取进度,可是试试httpcache或者memorycache,这两个我没有试过,请自行尝试。
ps:使用websocket来实现也是不错的,不过我没有试过,有心的大神可以去试试。
下面贴效果图:
实现方法如下
前端ajax上传文件,我使用了两种jq插件。一种是ajaxfileupload,一种是jquery.form.js(如需下载,请百度)。关于更多jQuery插件用法还可参阅本站相关专题: 《jQuery常用插件及用法总结》 。
下面的代码是ajaxFileUpload的:
$.ajaxFileUpload
(
{
url: '/WxManage/Media/UploadImage', //用于文件上传的服务器端请求地址
secureuri: false, //是否需要安全协议,一般设置为false
fileElementId: 'postFile', //文件上传域的ID
type:"post",
dataType: 'json', //返回值类型 一般设置为json
success: function(data, status) //服务器成功响应处理函数
{
CloseProgressbar();//关闭进度条 设置进度条进度为100
if (data.status == 1) {
layer.msg(data.msg, { icon: 1, time: 1000 },function() {
parent.location.reload();
});
} else {
$("#btnUploadFile").attr("disabled", false);
layer.msg(data.msg, { icon: 2, time: 1000 });
}
},
error: function(data, status, e) //服务器响应失败处理函数
{
$("#btnUploadFile").attr("disabled", false);
CloseProgressbar();
layer.closeAll("dialog");
layer.msg("上传失败", { icon: 2, time: 1000 });
}
}
);
后端接收文件上传请求的action:
[HttpPost]
public ActionResult UploadImage(HttpPostedFileBase postFile)
{
if (postFile == null)
{
return Json(BasicConfig.MessageConfig.Fail("上传文件不得为空"));
}
try
{
string format = postFile.FileName.Split('.').Last();//后缀名
SaveFile(postFile);
return Json(BasicConfig.MessageConfig.Success("上传成功"));
}
catch (Exception ex)
{
return Json(BasicConfig.MessageConfig.Fail("上传失败"));
}
}
SaveFile方法是保存文件的方法,采用的是文件流方式保存以便于计算上传进度:
核心代码:
FileStream fs = new FileStream(fileSavePath, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
BinaryReader br = new BinaryReader(postFile[i].InputStream);
int readCount = 0;//单次读取的字节数
while ((readCount = br.Read(bufferByte, 0, readBufferSize)) > 0)
{
bw.Write(bufferByte, 0, readCount);//写入字节到文件流
bw.Flush();
saveCount += readCount;//已经上传的进度
mem.SetValue("Admin_UploadSpeed_" + Session.SessionID, (saveCount * 1.0 / totalCount).ToString("0.00"), 60);//将更新到memcached缓存中
Thread.Sleep(200);//为了看到明显的过程故意暂停
}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。