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 confirm选择判断
Oct 18 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
js实现继承的5种方式
Dec 01 Javascript
AngularJS的ng Http Request与response格式转换方法
Nov 07 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
Nov 18 Javascript
JS中的BOM应用
Feb 02 Javascript
vue-cli中vue本地实现跨域调试接口
Jan 16 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
Jan 28 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
Dec 06 Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 Javascript
JavaScript实现拖拽功能
Feb 11 Javascript
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
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
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
异步JS框架的作用以及实现方法
2015/10/29 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
Python reduce()函数的用法小结
2017/11/15 Python
python实现神经网络感知器算法
2017/12/20 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
Python之web模板应用
2017/12/26 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
python的launcher用法知识点总结
2020/08/07 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
经典C++面试题一
2016/11/06 面试题
幼儿园教师培训制度
2014/01/16 职场文书
出国留学计划书
2014/04/27 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers
python神经网络 使用Keras构建RNN训练
2022/05/04 Python