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 相关文章推荐
xml分页+ajax请求数据源+dom取结果实例代码
Oct 31 Javascript
JavaScript 常用函数库详解
Oct 21 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
js实现幻灯片播放图片示例代码
Nov 07 Javascript
jQuery遍历Table应用示例
Apr 09 Javascript
javascript组合使用构造函数模式和原型模式实例
Jun 04 Javascript
js实现新年倒计时效果
Dec 10 Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 Javascript
基于JS脚本语言的基础语法详解
Jul 22 Javascript
ReactNative中使用Redux架构总结
Dec 15 Javascript
在NPM发布自己造的轮子的方法步骤
Mar 09 Javascript
vue微信分享插件使用方法详解
Feb 18 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
php英文单词统计器
2016/06/23 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
python 实现堆排序算法代码
2012/06/05 Python
介绍Python中的文档测试模块
2015/04/28 Python
Python中subprocess模块用法实例详解
2015/05/20 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
Python中异常重试的解决方案详解
2017/05/05 Python
python中reader的next用法
2018/07/24 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
论群众路线学习心得体会
2014/10/31 职场文书