效果预览

点击选择文件,选择了文件后即上传,上传完成后点击保存,保存成功后模态框自动关闭。

前端代码:

html

<div class='form-group'><label class='col-sm-2 control-label'>上传图像:</label><div class='col-sm-10'><input type="file" class="newFile"/><input type="hidden" name="newFileMsg" data-name=""/></div>
</div>
<div class='form-group' style="display: none;" id="myModal_add_progressBar_Module"><label class='col-sm-2 control-label'>上传进度:</label><div class='col-sm-10'><div class="progress"><div class="progress-bar" id="myModal_add_progressBar" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" style="width:0;" ></div></div><span id="percentage"></span><span id="time"></span></div>
</div>

js

//图片上传
$(".newFile").on('change', function(e){var fileObj = e.currentTarget.files[0]; // js 获取文件对象var name = e.currentTarget.files[0].name;$(".newFile").parents("div.col-sm-10").find("input[name='newFileMsg']").attr("data-name",name);var url="/tbQuestion/uploadImg";var form = new FormData(); // FormData 对象form.append("file", fileObj); // 文件对象var xhr;xhr = new XMLHttpRequest();  // XMLHttpRequest 对象xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。xhr.onload = uploadComplete; //请求完成xhr.onerror =  uploadFailed; //请求失败xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】xhr.upload.onloadstart = function(){//上传开始执行方法ot = new Date().getTime();   //设置上传开始时间oloaded = 0;//设置上传开始时,以上传的文件大小为0};xhr.send(form); //开始上传,发送form数据//显示进度条$("#myModal_add_progressBar_Module").css("display","block");
});//上传成功响应
function uploadComplete(evt){//服务断接收完文件返回的结果//console.log(evt);var imgUrl = JSON.parse(evt.target.responseText);$(".newFile").parents("div.col-sm-10").find("input[name='newFileMsg']").val(imgUrl);
}
//上传失败
function uploadFailed(evt){parent.layer.msg("上传失败");
}
//上传进度实现方法,上传过程中会频繁调用该方法
function progressFunction(evt){// event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0if (evt.lengthComputable){$("#myModal_add_progressBar").css("width",Math.round(evt.loaded / evt.total * 100) + "%");$("#myModal_add_progressBar").html(Math.round(evt.loaded / evt.total * 100) + "%");$("#percentage").html("已上传"+Math.round(evt.loaded / evt.total * 100) + "%");}var nt = new Date().getTime();//获取当前时间var pertime = (nt-ot)/1000; //计算出上次调用该方法时到现在的时间差,单位为sot = new Date().getTime(); //重新赋值时间,用于下次计算var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位boloaded = evt.loaded;//重新赋值已上传文件大小,用以下次计算//上传速度计算var speed = perload/pertime;//单位b/svar bspeed = speed;var units = 'b/s';//单位名称if(speed/1024>1){speed = speed/1024;units = 'k/s';}if(speed/1024>1){speed = speed/1024;units = 'M/s';}speed = speed.toFixed(1);//剩余时间var resttime = ((evt.total-evt.loaded)/bspeed).toFixed(1);$("#time").html(',速度:'+speed+units+',剩余时间:'+resttime+'s');
}

批量导入

压缩文件或单一文件的差异:

点击选择文件,选择了文件后,需点击保存后才上传,上传完成后模态框自动关闭。

当导入大文件交给后台处理时,文件上传完成,进度条到100%,但导入整个过程并没有结束,即模态框不会马上关闭。

前端代码

html

<div class='form-group'><label class='col-sm-2 control-label'>选择文件</label><div class='col-sm-10'><input type="file" name="file" id="bulkImport"/></div>
</div>
<div class='form-group' id="fileSizeModule" style="display: none;"><label class='col-sm-2 control-label'>文件大小</label><div class='col-sm-10'><input type="text" class="form-control" name="fileSize"/></div>
</div>
<div class='form-group' style="display: none;" id="progressModule"><label class='col-sm-2 control-label'>上传进度</label><div class='col-sm-10'><div class="progress"><div id="progressBar" class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0"></div></div></div>
</div>

js

//用户点击批量导入 重置批量导入模态框
$("#clickBulkImport").click(function(){$("#fileSizeModule").css("display","none");$("#progressModule").css("display","none");$("#bulkImport").val("");$("#fileSizeModule").find("input[name='fileSize']").val("");$("#progressBar").attr("aria-valuemax","100");//kb$("#progressBar").attr("aria-valuenow","0");$("#progressBar").css("width","0");
});//用户选择了上传文件
$("#bulkImport").on('change', function( e ){$("#fileSizeModule").css("display","block");var fileSize = e.currentTarget.files[0].size;var totalNum=Math.round(Number(fileSize)/1024);$("#myModal_import").find("form input[name='fileSize']").val("大约"+totalNum+"KB");
});//批量导入 保存
$("#myModal_import").on("click",".saveBtn",function(){var fileObj = document.getElementById("bulkImport").files[0]; // js 获取文件对象var name = fileObj.name;var url="/batchImportEastQuest/import";var form = new FormData(); // FormData 对象form.append("file", fileObj); // 文件对象var xhr;xhr = new XMLHttpRequest();  // XMLHttpRequest 对象xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。xhr.onload = uploadComplete2; //请求完成xhr.onerror =  uploadFailed2; //请求失败xhr.upload.onprogress = progressFunction2;//【上传进度调用方法实现】xhr.upload.onloadstart = function(){//上传开始执行方法ot = new Date().getTime();   //设置上传开始时间oloaded = 0;//设置上传开始时,以上传的文件大小为0};xhr.send(form); //开始上传,发送form数据//显示进度条$("#progressModule").css("display","block");
});//上传成功响应
function uploadComplete2(evt){//服务断接收完文件返回的结果//console.log(evt);parent.layer.msg('批量导入成功!', {icon: 1});$("#progressModule").css("display","none");//隐藏进度条//关闭模态框$("#myModal_import").find(".modal-header .sr-only").click();var pageNum=$("b.presentPage").html();goPage(pageNum);
}
//上传失败
function uploadFailed2(evt){parent.layer.msg("导入失败");
}
//上传进度实现方法,上传过程中会频繁调用该方法
function progressFunction2(evt){// event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0if (evt.lengthComputable){$("#progressBar").css("width",Math.round(evt.loaded / evt.total * 100) + "%");$("#progressBar").html(Math.round(evt.loaded / evt.total * 100) + "%");}var nt = new Date().getTime();//获取当前时间var pertime = (nt-ot)/1000; //计算出上次调用该方法时到现在的时间差,单位为sot = new Date().getTime(); //重新赋值时间,用于下次计算var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位boloaded = evt.loaded;//重新赋值已上传文件大小,用以下次计算
}

代码参考了:https://www.cnblogs.com/007sx/p/7520529.html

进度条优化

优化点:

之前的进度条过于真实,前端数据处理完成,没有考虑后端数据是否处理完。这样一旦后端出错导致前端操作失败,而前端进度条又走到底了,很容易给用户错误的引导。

本次改进,前端进度条人为设置最大值为98%,直到收到后端处理完成的信息后,再将进度条走到100%。

这样操作需要后端同事配合。万一你遇到的同事,死活不给你返回信息,你就只能退而求其次将就了。

代码

html

<form class='form-horizontal' id="myModal_add_form"><div class='form-group'><label class='col-sm-2 control-label'>上传图像:</label><div class='col-sm-10'><input type="file" class="newFile"/><input type="hidden" name="newFileMsg" data-name=""/><input type="hidden" name="userId"/><input type="hidden" name="faceId"/></div></div><div class='form-group' style="display: none;" id="myModal_add_progressBar_Module"><label class='col-sm-2 control-label'>上传进度:</label><div class='col-sm-10'><div class="progress"><div class="progress-bar" id="myModal_add_progressBar" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" style="width:0;" ></div></div></div></div>
</form>

js

//图片上传$(".newFile").on('change', function(e){var userName=$(this).parents(".modal-content").find("input[name='name']").val();if(userName == ""){parent.layer.msg("必须先填写姓名!");document.getElementById("myModal_add_form").reset();return }else{if(Math.round(Number(e.currentTarget.files[0].size)/1024) > 10240){parent.layer.msg("图片太大,请压缩大小后上传!图片最大 10 MB!");document.getElementById("myModal_add_form").reset();return }else{var activityId = $("#searchForm").find("select[name='activeId']").val();var fileObj = e.currentTarget.files[0]; // js 获取文件对象var name = e.currentTarget.files[0].name;$(".newFile").parents("div.col-sm-10").find("input[name='newFileMsg']").attr("data-name",name);var url="/faceRecognition/activityManage/uploadImg?name="+userName+"&activityId="+activityId;var form = new FormData(); // FormData 对象form.append("file", fileObj); // 文件对象var xhr;xhr = new XMLHttpRequest();  // XMLHttpRequest 对象xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。xhr.onload = uploadComplete; //请求完成xhr.onerror =  uploadFailed; //请求失败xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】xhr.upload.onloadstart = function(){//上传开始执行方法ot = new Date().getTime();   //设置上传开始时间oloaded = 0;//设置上传开始时,以上传的文件大小为0};xhr.send(form); //开始上传,发送form数据//显示进度条$("#myModal_add_progressBar_Module").css("display","block");}}});//上传成功响应function uploadComplete(evt){//服务器接收完文件返回的结果var res=JSON.parse(evt.target.responseText);if(res.code == 0){//上传成功$(".newFile").parents("div.col-sm-10").find("input[name='newFileMsg']").val(res.data.url);$(".newFile").parents("div.col-sm-10").find("input[name='userId']").val(res.data.id);$(".newFile").parents("div.col-sm-10").find("input[name='faceId']").val(res.data.faceId);//进度条设置为100%;$("#myModal_add_progressBar").css("width","100%");$("#myModal_add_progressBar").html("100%");}}//上传失败function uploadFailed(evt){parent.layer.msg("上传失败");}//上传进度实现方法,上传过程中会频繁调用该方法function progressFunction(evt) {// event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0if (evt.lengthComputable) {//进度条限制 上传时永远不能达到100% 最大98% 除非收到后端返回值 才设置为100%$("#myModal_add_progressBar").css("width", Math.floor(evt.loaded / evt.total * 100)-2 + "%");$("#myModal_add_progressBar").html(Math.floor(evt.loaded / evt.total * 100)-2 + "%");}var nt = new Date().getTime();//获取当前时间var pertime = (nt - ot) / 1000; //计算出上次调用该方法时到现在的时间差,单位为sot = new Date().getTime(); //重新赋值时间,用于下次计算var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位boloaded = evt.loaded;//重新赋值已上传文件大小,用以下次计算}

真实的上传进度条及优化相关推荐

  1. ssm上传文件进度条_Java 单文件、多文件上传 / 实现上传进度条

    日常,工作 在这里总结一下上传吧(是以前做过的练习,就汇总到个人博客吧) java ssm 框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传 ...

  2. Asp无组件上传进度条解决方案

    http://webuc.net/dotey/archive/2004/07/22/1334.aspx 我还是一点一点用一个实例来说明的吧,客户端HTML如下.要浏览上传附件,我们通过<inpu ...

  3. php大文件上传插件,PHP 大文件上传进度条实现

    目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩 ...

  4. java 上传 进度条_Ajax上传文件并显示进度条

    第四步:编写前端代码. 1.路径在 当前项目的:src\main\resources\asyn.html 上传进度条 align="center"> 0% bordercol ...

  5. html如何显示上传进度条,HTML5 Ajax文件上传进度条如何显示

    这篇文章主要介绍了HTML5 Ajax文件上传进度条是如何显示的,基于原生html5实现,不需要falsh支持,进度可以自定义显示,控制灵活,对HTML5上传进度条感兴趣的小伙伴们可以参考一下 原本打 ...

  6. php flash上传进度条,PHP_PHP+FLASH实现上传文件进度条相关文件 下载,PHP之所以很难实现上传进度条 - phpStudy...

    PHP+FLASH实现上传文件进度条相关文件 下载 PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候,要等到文件全部送到服务器之后,才执行相应的php文件.在这之前,文件数据保存在一个 ...

  7. 大文件上传 进度条显示(仿CSDN资源上传效果) .

    浏览-选择文件-点击 "上传 "后,效果如下: 弹出透明UI遮罩层 并显示上传这个过程 我这里设置太透明了 效果不是很立体 文件结构如图: 说明:用到"高山来客" ...

  8. html资源文件记载进度条,HTML5矢量实现文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  9. jquery和php上传文件进度条,jQuery实现文件上传进度条特效_jquery

    上传进度条通常是由前面jquery加后端了脚本器脚本来实现了,今天我们介绍的是一款基本php+jQuery实现文件上传进度条效果的例子,具体细节如下. 最近呢,一个项目做一个进度条的效果出来,这个之前 ...

最新文章

  1. python 判断类型_青少年之Python编程课程安排lt;第一季gt;
  2. intel lock汇编指令保障有序性
  3. 在Windows 下如何使用 AspNetCore Api 和 consul
  4. 美国《预防》杂志近期帮大家总结了11种自然疗法来对抗高血压
  5. bootstrap 输入错误提示_网上体育用品商城(ssm,mysql,bootstrap,html,css)
  6. mysql5.6主从不报错_mysql5.6.26主从复制报错1050
  7. linux编译安装rrdtool,Linux下RRDTool安装方法
  8. 使用ArcGIS提取HWSD中的土壤属性数据
  9. SAP Hybris企业培训
  10. 19-备忘录模式Quarkus实现
  11. 电脑一敲键盘就跳转计算机,Win10系统电脑关机后一敲键盘就开机 win10系统为什么按键盘任意键自动开机...
  12. 端口碰撞技术让开放端口更安全
  13. 安卓开发教你监听手机Home键
  14. 软件推荐:Typora -新手上路-夏凌玥
  15. 1714. 混合牛奶
  16. 20162316刘诚昊 第三周学习总结
  17. 如何制作证件照?分享几种简单的证件照制作方法
  18. django迁移数据库乱了,彻底重新再来的步骤
  19. 阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
  20. 微信小程序——video视频全屏播放

热门文章

  1. 在线练习题库python_有哪些 python 的在线练习题或编程挑战的网站?
  2. HTML-DOM树篇
  3. Google导航代码
  4. 产品经理如何去做需求分析,建议收藏
  5. Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同
  6. 老师天天让发健康码拼图,于是自己决定搞个小工具,简单又省心
  7. 1.VHDL的基础知识
  8. 中国伺服电机市场运行状况分析及投资战略研究报告2022-2028年
  9. 摄像头打闪泛绿解决方法
  10. MetaMask与Web3中智能合约调用