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 相关文章推荐
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
Apr 20 Javascript
怎么选择Javascript框架(Javascript Framework)
Nov 22 Javascript
js window.onload 加载多个函数和追加函数详解
Jan 08 Javascript
js跳转页面方法总结
Jan 29 Javascript
jQuery多项选项卡的实现思路附样式及代码
Jun 03 Javascript
JavaScript Split()方法
Dec 18 Javascript
干货!教大家如何选择Vue和React
Mar 13 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
Apr 27 Javascript
JS实现的随机排序功能算法示例
Jun 09 Javascript
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 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
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
php中的依赖注入实例详解
2019/08/14 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
Python struct模块解析
2014/06/12 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
python中int与str互转方法
2018/07/02 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
如何进行Linux分区优化
2016/09/13 面试题
医学生个人求职信范文
2013/09/24 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
研究生简历自我评
2015/03/11 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电