JS实现批量上传文件并显示进度功能


Posted in Javascript onJune 27, 2017

今天接受项目中要完成文件批量上传文件而且还要显示上传进度,一开始觉得这个应该不是很麻烦,当我在做的时候遇到了很多问题,很头疼啊。

不过看了别人写的代码,自己也测试过,发现网上好多都存在一些问题,并不是自己想要的。然后自己查阅各种资料,经过自己总结,最终完成了这个功能。

如果大家有什么问题可以提出来,一起交流,学习。有什么不对的地方也指出来,我也虚心学习。自己也是刚写博客,您们的赞是我写博客的动力,谢谢大家。

条件:我采用struts2,java ,ajax,FormData实现;

JS实现批量上传文件并显示进度功能

1.实现的逻辑一定要清楚,多文件上传要在input标签中添加 multiple属性

JS实现批量上传文件并显示进度功能

2.点击上传后触发的方法

JS实现批量上传文件并显示进度功能

3.循环将选择的文件添加到FormData对象中

JS实现批量上传文件并显示进度功能

4.将发送ajax的内容封装到一个方法中,循环ajax,对多个文件一次一次提交。这里要注意了,ajax循环时要采用递归的方式,如果采用for循环,就会得到你意想不到的结果,ajax是异步请求。

5.在ajax中添加xhr,设置上传监听事件。

JS实现批量上传文件并显示进度功能

6.java后台接收,当后台接收到action时,你会看到getFiles()方法中已经得到了上传文件在tomcat服务下的地址。,其它参数均能得到,这里我就不一一展示了。

JS实现批量上传文件并显示进度功能

7.当ajax成功返回数据时,说明该文件已经传到服务器上了,此时移除上一个文件并执行后面的文件发送ajax

JS实现批量上传文件并显示进度功能

8.监听事件的写法,监听每一个文件上传速度情况。

JS实现批量上传文件并显示进度功能

下面我就分享出我做测试用的代码,如果大家有什么不懂的地方可以评论出来,大家一起交流学习进步。

html部分:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="./css/NewFile.css" rel="external nofollow" >
<script type="text/javascript" src="./js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="./js/fileMuti.js"></script>
</head>
<body>
<div id="test">
<input type="file" id="fileMutiply" name="files" multiple="multiple" >
</div>
</body>
</html>

js文件部分:这是关键,

/**
 * 
 */
var i=0;
var j=0;
$(function(){
  $("#fileMutiply").change(function eventStart(){
    var ss =this.files; //获取当前选择的文件对象
     for(var m=0;m<ss.length;m++){ //循环添加进度条
         efileName = ss[m].name ;
     if (ss[m].size> 1024 * 1024){
      sfileSize = (Math.round(ss[m].size /(1024 * 1024))).toString() + 'MB';
      }
    else{
      sfileSize = (Math.round(ss[m].size/1024)).toString() + 'KB';
      }
     $("#test").append(
     "<li id="+m+"file><div class='progress'><div id="+m+"barj class='progressbar'></div></div><span class='filename'>"+efileName+"</span><span id="+m+"pps class='progressnum'>"+(sfileSize)+"</span></li>");
         }
     sendAjax();
     function sendAjax() { 
         if(j>=ss.length)  //采用递归的方式循环发送ajax请求
        { 
         $("#fileMutiply").val("");
            j=0;
          return; 
        }
        var formData = new FormData();
        formData.append('files', ss[j]); //将该file对象添加到formData对象中
          $.ajax({
            url:'fileUpLoad.action',
            type:'POST',
            cache: false,
            data:{},//需要什么参数,自己配置
            data: formData,//文件以formData形式传入
            processData : false, 
            //必须false才会自动加上正确的Content-Type 
            contentType : false , 
          /*  beforeSend:beforeSend,//发送请求
            complete:complete,//请求完成
    */      xhr: function(){   //监听用于上传显示进度
              var xhr = $.ajaxSettings.xhr();
              if(onprogress && xhr.upload) {
               xhr.upload.addEventListener("progress" , onprogress, false);
               return xhr;
              }
              } ,
            success:function(data){
              $(".filelist").find("#"+j+"file").remove();//移除进度条样式
               j++; //递归条件
              sendAjax();
          //   }
            },
            error:function(xhr){
             alert("上传出错");
            }               
          });
        } 
  })
    function onprogress(evt){
     var loaded = evt.loaded;   //已经上传大小情况 
     var tot = evt.total;   //附件总大小 
     var per = Math.floor(100*loaded/tot); //已经上传的百分比 
     $(".filelist").find("#"+j+"pps").text(per +"%");
     $(".filelist").find("#"+j+"barj").width(per+"%");
     };
})

以上所述是小编给大家介绍的JS实现批量上传文件并显示进度,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery的Ajax时无响应数据的解决方法
May 25 Javascript
关于jquery中全局函数each使用介绍
Dec 10 Javascript
Jquery解析json数据详解
Dec 26 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
js捕捉键盘事件和按键键值的方法
Oct 10 Javascript
Angular1.x自定义指令实例详解
Mar 01 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
Mar 03 Javascript
js图片上传的封装代码
Aug 01 Javascript
vue修改vue项目运行端口号的方法
Aug 04 Javascript
React Native使用百度Echarts显示图表的示例代码
Nov 07 Javascript
jQuery实现碰到边缘反弹的动画效果
Feb 24 jQuery
vue项目中vue-i18n和element-ui国际化开发实现过程
Apr 25 Javascript
angular过滤器实现排序功能
Jun 27 #Javascript
详解AngularJS ng-class样式切换
Jun 27 #Javascript
各种选择框jQuery的选中方法(实例讲解)
Jun 27 #jQuery
JavaScript事件方法(实例讲解)
Jun 27 #Javascript
简单谈谈原生js的math对象
Jun 27 #Javascript
Vue.js实现一个todo-list的上移下移删除功能
Jun 26 #Javascript
AngularJS 最常用的八种功能(基础知识)
Jun 26 #Javascript
You might like
用PHP和MySQL保存和输出图片
2006/10/09 PHP
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
python3生成随机数实例
2014/10/20 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python-opencv颜色提取分割方法
2018/12/08 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
用Python解决x的n次方问题
2019/02/08 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
让生命充满爱演讲稿
2014/05/10 职场文书
疾病捐款倡议书
2014/05/13 职场文书
华清池导游词
2015/02/02 职场文书
护士先进个人总结
2015/02/13 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Python OpenCV之常用滤波器使用详解
2022/04/07 Python
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers