应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

ASP.NET MVC + WebUploader+BootStrap实现文件上传进度条显示

9499人阅读 2019/9/21 14:41 总访问:5186125 评论:0 收藏:0 手机
分类: .NET MVC


引入需要的资源文件:

  1. <script src="~/Content/jquery-1.9.1.min.js"></script>
  2. <link href="~/Content/webuploader/webuploader.css" rel="stylesheet" />
  3. <script src="~/Content/webuploader/webuploader.min.js"></script>

html:

  1. <div id="uploader" class="wu-example">
  2.     <!--用来存放文件信息-->
  3.     <ul id="thelist" class="list-group"></ul>
  4.     <div class="uploader-list"></div>
  5.     <div class="btns">
  6.         <div id="picker" style="float: left;">选择文件</div>
  7.         <input id="ctlBtn" type="button" value="开始上传" class="btn btn-default" style="width: 78px; height: 37px; margin-left: 10px;" />
  8.     </div>
  9. </div>
  10. <!-- 自己简单弄一个进度条-->
  11. <div id="progressdiv" style="width: 500px; background: #f5f5f5; height: 34px; margin-top: 50px;">
  12.     <div class="progress-bar" style="height: 34px; background: #53CED9; width: 0px">
  13.     </div>
  14. </div>

js:

  1. <script>
  2.     var applicationPath = window.applicationPath === "" ? "" : window.applicationPath || "../../";
  3.     var GUID = WebUploader.Base.guid();//一个GUID
  4.     $(function ({
  5.         var $ = jQuery;
  6.         var $list = $('#thelist');
  7.         var uploader = WebUploader.create({
  8.             // 选完文件后,是否自动上传。
  9.             auto: false,
  10.             // swf文件路径
  11.             swf: applicationPath + '../Content/webuploader/Uploader.swf',
  12.             // 文件接收服务端。
  13.             //server: applicationPath + '/home/Upload',
  14.             server: '/home/Upload',
  15.             // 选择文件的按钮。可选。
  16.             // 内部根据当前运行是创建,可能是input元素,也可能是flash.
  17.             pick: '#picker',
  18.             // 只允许选择office文件。
  19.             accept: {
  20.                 title'Office',
  21.                 extensions"pdf,doc,ppt,pptx,xls,xlsx,docx,rar,zip,7z,tar.gz,war,jar,txt,chm,pdr,azw,prc,mbp,tan,tpz,epub,mobi,rp",
  22.                 mimeTypes".pdf,.doc,.ppt,.pptx,.xls,.xlsx,.docx,.rar,.zip,.7z,.tar.gz,.war,.jar,.txt,.chm,.pdr,.azw,.prc,.mbp,.tan,.tpz,.epub,.mobi,.rp"
  23.             },
  24.             // 只允许选择视频文件。
  25.             //accept: {
  26.             // title: 'Video', 文字描述
  27.             // extensions: 'mp4,ogv,webm', 允许的文件后缀,不带点,多个用逗号分割。
  28.             // mimeTypes: 'video/*', 多个用逗号分割。
  29.             // },
  30.             fileNumLimit: 10,                              //最大上传数量为10
  31.             fileSingleSizeLimit: 50 * 1024 * 1024,         //限制上传单个文件大小20M  (上传文件过大居然没有提示,我说什么效果都没有)
  32.             fileSizeLimit: 200 * 1024 * 1024,              //限制上传所有文件大小200M
  33.             //上传文件数量限制
  34.             fileNumLimit: 1,
  35.             // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  36.             resize: false
  37.         });
  38.         // 当有文件被添加进队列的时候
  39.         uploader.on('fileQueued'function (file{
  40.             $list.append('<div id="' + file.id + '" class="item">' +
  41.                 '<h4 class="info">' + file.name + '</h4>' +
  42.                 '<p class="state">等待上传...</p>' +
  43.                 '</div>');
  44.             var name = file.name; //文件名
  45.             var type = fileType(file.name); //文件类型,获取的是文件的后缀
  46.             var volume = bytesToSize(file.size); //文件大小格式化
  47.             var oTr = $("<tr></tr>");
  48.             var str = '<td><cite title="' + name + '">' + name + '</cite></td>';
  49.             str += '<td>' + type + '</td>';
  50.             str += '<td>' + volume + '</td>';
  51.             str += '<td id="jintutiao">';
  52.             str += '<span id="baifenbi"></span>0%';
  53.             str += '</td>';
  54.             str += '<td id="uploding">等待上传</td>';
  55.             $(".fileList").html(str)
  56.         });
  57.         var aa = 1;
  58.         // 文件上传过程中创建进度条实时显示。
  59.         uploader.on('uploadProgress'function (file, percentage{
  60.             console.log("上传中");
  61.             //计算进度条应该显示的宽度(进度条div的宽度*百分比即可)
  62.             var precentWidth = parseInt($("#progressdiv").width()) * percentage;
  63.             console.log(percentage);
  64.             console.log("计算出来的宽度:" + precentWidth);
  65.             $(".progress-bar").width(precentWidth)
  66.             // $percent.css('width', percentage * 100 + '%');
  67.             // console.log(percentage * 100 + '%');
  68.             if (percentage == 1) {
  69.                 aa++;
  70.             }
  71.             if (aa <= 2) {
  72.                 var shuzi = percentage * 100;
  73.                 $("#baifenbi").html(shuzi.toFixed(2));
  74.             }
  75.         });
  76.         // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  77.         uploader.on('uploadSuccess'function (file, response{
  78.             console.log("已上传");
  79.             $('#' + file.id).find('p.state').text('已上传');
  80.             //上传成功后,到Merge控制器
  81.             $.post('/#/Merge', { guid: GUID, fileName: file.name }, function (data{
  82.                 $("#uploader .state").html("上传成功...");
  83.                 $("#uploding").html("上传成功");
  84.             });
  85.         });
  86.         /**
  87.          * 验证文件格式以及文件大小
  88.          */
  89.         uploader.on("error"function (type{
  90.             if (type == "Q_TYPE_DENIED") {
  91.                 alert("请上传JPG、PNG、GIF、BMP格式文件");
  92.             } else if (type == "Q_EXCEED_SIZE_LIMIT") {
  93.                 alert("文件大小不能超过50M");
  94.             } else {
  95.                 alert("上传出错!请检查后重新上传!错误代码" + type);
  96.             }
  97.         });
  98.         // 完成上传完了,成功或者失败,先删除进度条。
  99.         uploader.on('uploadComplete'function (file{
  100.             console.log("uploadComplete");
  101.             $('#' + file.id).find('.progress').fadeOut();
  102.         });
  103.         //所有文件上传完毕
  104.         uploader.on("uploadFinished"function ({
  105.             //提交表单
  106.             console.log("提交表单");
  107.         });
  108.         //开始上传
  109.         $("#ctlBtn").click(function ({
  110.             uploader.upload();
  111.         });
  112.     });
  113.     //字节大小转换,参数为b
  114.     function bytesToSize(bytes{
  115.         var sizes = ['Bytes''KB''MB''G'];
  116.         if (bytes == 0return 'n/a';
  117.         var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
  118.         return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
  119.     };
  120.     //通过文件名,返回文件的后缀名
  121.     function fileType(name{
  122.         var nameArr = name.split(".");
  123.         return nameArr[nameArr.length - 1].toLowerCase();
  124.     }
  125. </script>

后台:

  1. public ActionResult Upload()
  2. {
  3.     string fileName = Request["name"];
  4.     //string fileRelName = fileName.Substring(0, fileName.LastIndexOf('.'));//设置临时存放文件夹名称
  5.     //int index = Convert.ToInt32(Request["chunk"]);//当前分块序号
  6.     //var guid = Request["guid"];//前端传来的GUID号
  7.     var data = Request.Files["file"];//表单中取得分块文件
  8.     string extension = data.FileName.Substring(data.FileName.LastIndexOf(".") + 1,
  9.         (data.FileName.Length - data.FileName.LastIndexOf(".") - 1));//获取文件扩展名
  10.     if (data != null)//为null可能是暂停的那一瞬间
  11.     {
  12.         data.SaveAs(Server.MapPath("~/Upload") + "/" + fileName);
  13.     }
  14.     return Json(new { erron = 0 });//Demo,随便返回了个值,请勿参考
  15. }

这里要注意asp.net  mvc中上传文件大小的限制,如果超过了就会报错,我们可以在web.config中配置

1:system.webServer中加入或修改配置

  1. <security>
  2.   <requestFiltering>
  3.     <requestLimits maxAllowedContentLength="2147483647" ></requestLimits>
  4.   </requestFiltering>
  5. </security>

2:system.web中加入或修改配置

  1. <!--最大请求长度,单位为kb-->
  2. <httpRuntime targetFramework="4.5" maxRequestLength="100000"  />

来看一个简单的效果:


上传文件的时候传递其他参数的问题,我们一般不是仅仅就只传递一个问题

  • 方法1:在添加文件的时候就直接先传递了,然后在传递其他参数(表单提交或者ajax看你喽)

    监听事件:当有文件被添加进队列的时候,直接提交文件上传

  1.    // 当有文件被添加进队列的时候
  2.    uploader.on('fileQueued'function (file{
  3.       //选择文件的时候直接上传
  4.       uploader.upload();
  5.    });
  • 方法2:监听文件发送之前的事件 , 文件和参数一起传递

  1.     //监听文件发送之前的事件
  2.     uploader.on('uploadBeforeSend'function (block, data{
  3.         // file为分块对应的file对象。
  4.         var file = block.file;
  5.         // 修改data可以控制发送哪些携带数据。
  6.         data.username = "xj";
  7.         data.number = "a";
  8.     });

        这里参数的传递可以直接表单序列化成功json字符串来传递还方便快捷一点,不用一个一个的取出来赋值


  • 方法3:监听上传完成事件uploadFinished,文件传递成功后在提交其他参数

  1.     //所有文件上传完毕
  2.     uploader.on("uploadFinished"function ({
  3.         //提交表单
  4.         console.log("提交表单");
  5.     });

万事开头难,demo就是这样了,大家实际用的时候可以随意的自由发挥



webuploader 接收后台返回值

我们不仅仅是需要前台验证后台也需要验证,所以真正的成功与否应该还需要根据后台的信息来进行验证

接收后台验证其实就是监听:uploadSuccess事件即可

  1. uploader.on('uploadSuccess'function (file, response{
  2.         //其他操作
  3.     //console.log(response);
  4.     if (response.Code == 500) {
  5.        alert(response.Message);
  6.     }
  7. });

其中的response就是后台的返回值,一般都是json所以可以直接点出来判断

tip:uploadSuccess事件比uploadComplete早一点


下面说一下博客项目中资源上传界面的处理

博客项目后台目前使用的是bootstrap,实际项目中运行肯定界面这些要做好看一点嘛

先看看效果图

上传文件的界面如下:

上传中的时候就显示出来进度条:

其实就是上传前显示点击上传文件,点击提交后就显示进度条而已。

就是一个小技巧在进度条div里边在加一个div来显示文字,上传前就显示出来,上传中就隐藏掉只显示进度条了

  1. <div class="progress progress-striped" style="height: 34px; margin-bottom: 5px; text-align: center">
  2.     <!-- 放个span来显示文字-->
  3.     <span style="display: inline-block;cursor:pointer; margin-top: 7px; display:block;"><i class="fa fa-folder"></i>请选择文件</span>
  4.     <!-- 实际进度条-->
  5.     <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">
  6.     </div>
  7. </div>

当然也可以不隐藏,上传中就显示文件的名字也是可以的,这样的话就会写一点样式来让里边的文字悬浮不影响进度条的显示


bootstrap进度条显示百分比

把span里边的样式删除掉即可

去掉这个sr-only样式后就可以显示了



demo下载地址:https://download.tnblog.net/resource/index/42AE33C8112246B79F4444B5596E94DA
.net core版本下载地址:https://download.tnblog.net/resource/index/d46969b5a1c840878c06485bff8173b0



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...