JavaScript实现form表单的多文件上传


Posted in Javascript onMarch 27, 2020

form表单的多文件上传,具体内容如下

formData对象可以使用一系列的键值对来模拟一个完整的表单,然后使用Ajax来发送这个表单

使用<form>表单初始化FormData对象的方式上传文件

<!--文件上传-->
 <form id="uploadForm" enctype="multipart/form-data">
 <div class="row" style="margin-top: 20px;">
 <div class="form-group col-md-12" id="file">  
  <input type="hidden" name="_csrf-application"
   value="<?= $csrf ?>">
  <div class="form-group field-uploadform-excelfiles" style="margin-left: 30px;">
  <label class="control-label btn btn-primary"
   for="uploadform-excelfiles">选择文件</label>
  <input type="file" id="uploadform-excelfiles" name="UploadForm[excelFiles][]"
   multiple class="attachment-upload" accept=".xlsx">
  <input type="button" id="fileUpload" value="上传文件" class="btn btn-success" style="margin-left: 15px;">
  <div class="help-block"></div>
  <div id="fileName"></div>
  </div>

 </div>
 </div>
 <table role="presentation" class="table"><tbody id="files"></tbody></table> 
</form>

注意:

1. 使用formData对象进行表单上传必须要为form添加enctype="multipart/form-data"属性
2. 使用formData对象进行表单上传必须要对其开始填入的值按照name属性放入该对象中,不能开始使用action上传,后面使用formData进行上传,这样会导致上传数据出现错误

获取change事件改变的文件

var fileList;
 var allFile = [];
 //FormData对象初始化
 var form = document.getElementById("upload-form");
 var formData = new FormData(form);
 $("#uploadform-excelfiles").on('change', function (e) {
 //获取表单数据并传入formData中
 var norm = $("#norm").val();
 var major = $("#major").val();
 var type = $("#type").val();
 formData.set("norm",norm);
 formData.set("major",major);
 formData.set("type",type);

 var fileError = 0;
 fileList = e.currentTarget.files;
 $.each(fileList, function (index, item) {
  var fileName = item.name;
  var fileEnd = fileName.substring(fileName.indexOf("."));
  //上传文件格式判断
  if (fileEnd == ".xlsx") {
  allFile.push(item);
  $('#files').append( '<tr style="padding-top: 7px;">' +
     '<td>'+fileName+'</td>' +
     '<td>'+(item.size / 1024).toFixed(2)+'K</td>' +
     '<td><input type="button" class="btn btn-danger delete" value="删除"></td>' +
     '</tr>');
  //追加文件
  formData.append('UploadForm[excelFiles][]',item);
  } else {
  fileError++;
  }
 });
 if (fileError > 0) {
  alert("只能上传 “.xlsx” 格式的文件!");
  document.getElementById("upload-form").reset();
  return;
 }

 var fileCount = $('#files').find('tr').length;
 $('#fileName').html('共上传 ' + fileCount + ' 个文件');

 });

删除按钮事件

$('#files').on('click','.delete',function (e) {
 var saveFile = [];
 var norm = $("#norm").val();
 var major = $("#major").val();
 var type = $("#type").val();
 var deleteName = e.target.parentNode.previousElementSibling.previousElementSibling.textContent;
 var deleteIndex;
 //将不删除的放入数组中
 $.each(allFile,function (index, item) {
  if(item.name == deleteName){
   deleteIndex = index;
  }else {
  saveFile.push(item);
  }
 });
 allFile.splice(deleteIndex,1);
 //表单数据重置
 formData.set("norm",norm);
 formData.set("major",major);
 formData.set("type",type);
 formData.delete('UploadForm[excelFiles][]');
 //将不删除的数组追加的formData中
 $.each(saveFile,function (index, item) {
  formData.append('UploadForm[excelFiles][]',item);
 });

 e.target.parentNode.parentNode.remove();
 var fileCount = $('#files').find('tr').length;
 $('#fileName').html('共上传 ' + fileCount + ' 个文件');

 });

文件上传事件

$("#fileUpload").on('click',function () {
 var len = formData.getAll('UploadForm[excelFiles][]').length;
 $("#overlay").show();
 if(len > 1){
  var deleteBtn = $(".delete");
  //通过ajax进行上传
  $.ajax({
   url: '/finalize/upload',
   type: 'POST',
   cache: false,
   data: formData,
   processData: false,
   contentType: false
  }).done(function(res) {
   if(res.code == 'ok'){
   //进度条设置
   var value = 0;
   var timer2 = setInterval(function () {
    value ++;
    $("#progress").css('width', value + "%");
    if (value == 120) {
    clearInterval(timer2);
    $("#overlay").hide();
    alert("文件上传成功!");
    }
   }, 50);
   //删除对应按钮
   $("#fileUpload").css("display","none");
   $.each(deleteBtn,function (index, item) {
   $(item).css("display","none");
   });
   $('#files').append('<tr><td><td><td><a type="button" class="btn btn-success pull-right" id="fileDown" href="/finalize/get-file?id=' + res.data.id + '" >文件下载</a></td></tr>')
  }

  }).fail(function(res) {
  alert("文件上传失败:" + res.msg);
  });
 }else {
  alert("请选择需要上传的文件!");
 }

 });

更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现的仿新浪微博完美的时间组件升级版
Dec 20 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
Aug 12 Javascript
js去空格技巧分别去字符串前后、左右空格
Oct 21 Javascript
JS判断当前页面是否在微信浏览器打开的方法
Dec 08 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
js弹出窗口返回值的简单实例
May 28 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
Feb 14 Javascript
Node.js操作redis实现添加查询功能
May 25 Javascript
浅谈angularJS2中的界面跳转方法
Aug 31 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 Javascript
javascript面向对象三大特征之多态实例详解
Jul 24 Javascript
Node.js API详解之 util模块用法实例分析
May 09 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
May 10 #Javascript
利用PM2部署node.js项目的方法教程
May 10 #Javascript
全面解析vue中的数据双向绑定
May 10 #Javascript
利用forever和pm2部署node.js项目过程
May 10 #Javascript
javascript简单链式调用案例分析
May 10 #Javascript
Angular.JS通过指令操作DOM的方法
May 10 #Javascript
JS实现队列的先进先出功能示例
May 10 #Javascript
You might like
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
php 获取百度的热词数据的代码
2012/02/18 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
javascript读取xml
2006/11/04 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
三个python爬虫项目实例代码
2019/12/28 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
班长竞选演讲稿
2014/04/24 职场文书
优秀员工评优方案
2014/06/13 职场文书
大一新生期末自我评价
2014/09/12 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers