asp.net mvc 实现上传文件带进度条

思路:ajax异步上传文件,且开始上传文件的时候启动轮询来实时获取文件上传进度。保存进度我采用的是memcached缓存,因为项目其他地方也用了的,所以就直接用这个啦。注意:不能使用session来保存进度,因为session是线程安全的不能实时获取进度,可是试试httpcache或者memorycache,这两个我没有试过,请自行尝试。

ps:使用websocket来实现也是不错的,不过我没有试过,有心的大神可以去试试。

下面贴一张效果图:

前端ajax上传文件,我使用了两种jq插件。一种是ajaxfileupload,一种是jquery.form.js(如需下载,请百度)

下面的代码是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:

 1 [HttpPost]
 2         public ActionResult UploadImage(HttpPostedFileBase postFile)
 3         {
 4             if (postFile == null)
 5             {
 6                 return Json(BasicConfig.MessageConfig.Fail("上传文件不得为空"));
 7             }
 8 
 9             try
10             {
11                 string format = postFile.FileName.Split('.').Last();//后缀名
12                 SaveFile(postFile);
13                 return Json(BasicConfig.MessageConfig.Success("上传成功"));
14             }
15             catch (Exception ex)
16             {
17                 return Json(BasicConfig.MessageConfig.Fail("上传失败"));
18             }
19         }
SaveFile方法是保存文件的方法,采用的是文件流方式保存以便于计算上传进度:
核心代码:
 1                 FileStream fs = new FileStream(fileSavePath, FileMode.Create);
 2                 BinaryWriter bw = new BinaryWriter(fs);
 3                 BinaryReader br = new BinaryReader(postFile[i].InputStream);
 4                 
 5                 int readCount = 0;//单次读取的字节数
 6                 while ((readCount = br.Read(bufferByte, 0, readBufferSize)) > 0)
 7                 {
 8                     bw.Write(bufferByte, 0, readCount);//写入字节到文件流
 9                     bw.Flush();
10                     saveCount += readCount;//已经上传的进度
11                     mem.SetValue("Admin_UploadSpeed_" + Session.SessionID, (saveCount * 1.0 / totalCount).ToString("0.00"), 60);//将更新到memcached缓存中
12                     Thread.Sleep(200);//为了看到明显的过程故意暂停 
13                 }        

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

关于.NET邮件的收发问题总结

        最近因为项目需要,研究了一下邮件的发送和接收,发现现在这方面的问题很多.虽然网上这方面的资料很多,但是真正应用起来 仍然会发现不少问题,而且很多...

751
来自专栏程序员的SOD蜜

使用微服务架构思想,设计部署OAuth2.0授权认证框架

2.6K3
来自专栏更流畅、简洁的软件开发方式

【自然框架】QuickPager分页控件,新增一种分页方式——伪URL分页(Postback版)

适用场景   先说一下伪URL分页的适用场景。在网站的网页里实现查询功能,如果查询条件比较少的话,还比较好办,把查询条件放到URL里面传递即可。但是如果查...

2346
来自专栏雪胖纸的玩蛇日常

python3+django2 开发易语言网络验证(中)

3177
来自专栏跟着阿笨一起玩NET

ASP.NET中Get和Post的用法

单form的提交有两种方式,一种是get的方法,一种是post 的方法.看下面代码,理解ASP.NET Get和Post两种提交的区别:

2632
来自专栏FreeBuf

简析60度CMS的Cookies欺骗漏洞

前言 本篇文章只是为了和大家分享漏洞的挖掘经验和思路,同时让大家认识到 Cookies 欺骗漏洞的危害和严重性。 漏洞发现时间:2017.8.16,因产商无回应...

2678
来自专栏分布式系统和大数据处理

Asp.Net 用户验证(自定义IPrincipal和IIdentity)

前一段时间有两个朋友问我,为什么在HttpModule中无法获得到Session值,因为他们希望自定义一个HttpModule,然后在其中获取Session来进...

1693
来自专栏智能合约

node.js实现CURL功能

1752
来自专栏.NET技术

小技术之异步上传文件

  最近公司任务多,MVC 和 C#系列都没更新,不过折腾了下异步上传,其实挺简单的,不过以前没做过,打算记录下来方便以后用到,同时分享给需要的朋友,中间也遇到...

1322
来自专栏hbbliyong

WCF浅尝

1.首先先建立一个WCF服务应用程序 ? 2.再建立一个宿主程序,这里用控制台,添加服务引用,这里会报错: ? 点击页面确定,回到添加服务页面 ? 点击箭头有如...

35410

扫码关注云+社区