需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中:

问题:由于只有一个file上传按钮,在多次点击上传按钮时,新的files文件会覆盖旧的files文件,需要使用一个变量集合存储;

   单个文件的删除,也需要我们对这个集合进行修改,最后使用ajax模拟form表单提交功能。

html:

  1. <section class="order-categories clearfix">
  2. <div class="order-complaint-title">Order NO. $!{ORDER_ID}</div>
  3. <input type="hidden" value="$!{ORDER_ID}" name="OrderID" />
  4. <textarea class="complaint-text" id="textareaContent" name="Content" placeholder="What is your Complaint?(At least 20 characters)"></textarea>
  5. <ul class="upimg-outer clearfix">
  6. <li class="add">
  7. <div>
  8. <span class="icon"></span>
  9. <input id="upFile1" type="file" name="file" value="" multiple="multiple" accept="image/*">
  10. </div>
  11. </li>
  12. </ul>
  13. <input type="button" name="" id="btnSubmit" value="SUBMIT" class="order-complaint-btn">
  14. </section>

JS:

图片上传&删除方法:

  1. uploadImgObjectCss.prototype = {
  2. init: function () {
  3. var _this = this;
  4. _this.removeImg();
  5. _this.upFileEleChange();
  6. },
  7. upFileEleChange: function () {
  8. var _this = this;
  9. _this.upFileEle.bind("change", function () {
  10. _this.setImagePreview();
  11. _this.removeImg();
  12.  
  13. });
  14. },
  15. //图像数据收集及预览--最多上传4张
  16. setImagePreview: function () {
  17. var _this = this;
  18. var docObj = _this.upFileEle[0];
  19. for (i = 0; i < 4; i++) {
  20. var imgObjPreview = new Image();
  21. if (docObj.files && docObj.files[i]) {
  22. imgObjPreview.src = window.URL.createObjectURL(docObj.files[i]);
  23. if (_this.upimgOuter.children("li:not(.add)").size() <= 3) {
  24. //判断files是否存在相同的图片
  25. var isExist = false;
  26. for (var f = 0; f < _this.files.length; f++) {
  27. if (_this.files[f].name == docObj.files[i].name) {
  28. isExist = true;
  29. }
  30. }
  31. if (!isExist) {
  32. _this.upimgOuter.find(".add").before($("<li><i></i></li>").append($("<div></div>").append($(imgObjPreview))));
  33. _this.files.push(docObj.files[i]);
  34. }
  35. }
  36. };
  37. };
  38.  
  39. if (_this.upimgOuter.children("li:not(.add)").size() >= 4) {
  40. _this.upimgOuter.find(".add").hide();
  41. };
  42. },
  43. //删除图片
  44. removeImg: function () {
  45. var _this = this;
  46. var $revPhotoI = $(".upimg-outer li i");
  47. $revPhotoI.bind("click", function () {
  48. var index = _this.upimgOuter.find("i").index(this);
  49. if (index > -1) {
  50. _this.files.splice(index, 1); //从files移除下标从index开始往下1个元素
  51. $(this).parent("li").remove();
  52. if (_this.upimgOuter.children("li:not(.add)").size() >= 4) {
  53. _this.upimgOuter.find(".add").hide();
  54. } else {
  55. _this.upimgOuter.find(".add").show();
  56. }
  57. }
  58. });
  59. }
  60. }

提交方法:

  1. var formData = new FormData();
  2. formData.append("OrderID", _this.orderID);
  3. formData.append("Content", $(window.OrderComplaintCache.textareaContent).val());
  4. for (var i = 0; i < _this.uploadImgObjectCss1.files.length; i++) {
  5. //formData.append("fileArray", _this.uploadImgObjectCss1.files[i]);
  6. formData.append("file" + i, _this.uploadImgObjectCss1.files[i]);
  7. }
  8. $.ajax({
  9. type: "post",
  10. url: "/ajax/usercenterHandler.js?action=complaintorder",
  11. data: formData,
  12. processData: false, //必须
  13. contentType: false, //必须
  14. success: function (json) {
  15. var data = null;
  16. try {
  17. data = JSON.parse(json);
  18. } catch (e) {
  19. data = new Function("return " + json + "")();
  20. }
  21. _this.fadeOutIconMessage("message-submit-succ", window.OrderComplaintCache.successMessage, 3000, function () {
  22. window.history.go(-1);
  23. });
  24. }

这里要注意几点:

  • processData设置为false。因为data值是FormData对象,不需要对数据做处理。
  • //<form>标签添加enctype="multipart/form-data"属性。
  • //cache设置为false,上传文件不需要缓存。
  • contentType设置为false,不设置contentType值,因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false。

上传后,服务器端代码需要使用从查询参数名为file获取文件输入流对象,因为<input>中声明的是name="file"

重点1--FormData对象:

  FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容。额,如果你说ie8什么的,那我们还是来谈谈今天的天气吧,我没听见。呵呵,开个玩笑,不支持FormData的,可以使用方法二,下面会介绍。接着说FormData,它是一个html5的javascript对象,非常的强大。

  FormData可以凭空创建一个对象,然后往这个对象里面添加数据,然后直接提交,不需要写一行html代码;

重点2--FormData添加多个上传文件:

   a.多个文件使用同一个变量名:"fileArray";

    formData.append("fileArray", _this.uploadImgObjectCss1.files[i]);

   b.使用关键词"file"+数字: file0,file1...

formData.append("file" + i, _this.uploadImgObjectCss1.files[i]);

  1.   c.如果只有一个文件,除上面的方法外,可使用关键词"file"添加到FormData

js_ajax模拟form表单提交_多文件上传_支持单个删除的更多相关文章

  1. Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)

    一.HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...

  2. ANDROID使用MULTIPARTENTITYBUILDER实现类似FORM表单提交方式的文件上传

    最近在做 Android 端文件上传,要求采用 form 表单的方式提交,项目使用的 afinal 框架有文件上传功能,但是始终无法与php写的服务端对接上,无法上传成功.读源码发现:afinal 使 ...

  3. Linux curl 模拟form表单提交信息和文件

    Linux curl 模拟form表单提交信息和文件   curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...

  4. 使用ajax提交form表单,包括ajax文件上传【转载】

    [使用ajax提交form表单,包括ajax文件上传] 前言 转载:作者:https://www.cnblogs.com/zhuxiaojie/p/4783939.html 使用ajax请求数据,很多 ...

  5. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html

    使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },&qu ...

  6. Yii2表单提交(带文件上传)

    今天写一个php的表单提交接口,除了基本的字符串数据,还带文件上传,不用说前端form标签内应该有这些属性 <form enctype="multipart/form-data&quo ...

  7. 使用ajax提交form表单,包括ajax文件上传

    前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },"json"); 又或者是这样的aja ...

  8. 使用bean接收ajax表单提交数据包含文件上传

    这几天写带图片上传的表单提交,一个配置小程序活动弹出框样式的功能,记录一下一些需要注意的地方 首先是 前端 JSP 文件的表单 <form class="search-wrapper& ...

  9. django项目中form表单和ajax的文件上传功能。

    form表单文件上传 路由 # from表单上传 path('formupload/',apply.formupload,name='formupload/'), 方法 # form表单文件上传 de ...

随机推荐

  1. java面试一、1.3线程与进程

    免责声明:     本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 1.3.进程和线程 线程和进程的概念.并行和并发的概念 线程和进程: 线程:是程序执行流的最小单元 ...

  2. 使用IDEA进行版本控制

    1.使用IDEA进行版本控制 创建git repository add-添加到暂存区 commit-提交到本地库 push-推送指定远程库(自己的) idea上的pull指的是合并(merge),并非 ...

  3. 自我理解node.js相比java的优势

    今天学习node.js,相比于之前学习过的java,node.js有一些优越之处.原因是它是一个基于Chrome v8引擎建立的JavaScript运行平台. (1)创建服务器:自行服务器来监听客户端 ...

  4. Python学习过程中各个难点---函数篇

    对于函数,我一直分不清局部变量与全局变量,今天又好好研究了下,终于搞清楚了. 例子: 其次对于global这个关键字我也是一知半解的状态,之前整个人都是懵懵的,现在搞明白了 匿名函数: 匿名函数使用关 ...

  5. 关于IO的整理

    我们知道io只是输入输出,在java语言中分为同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO,现在的IO,一般是用作两种用途:一种是进行文件或者目录的操作(将不同的输入输出源抽象成流,所以流 ...

  6. 在已有数据的表中添加id字段并且自增

    各位大牛,小弟在开发过程中,遇到了这样一个问题,由于新功能的增加需要使原有的一张表的结构作出调整,需要添加一个id主键字段,但是因为表里有很多数据了,所以,怎样才能添加这个字段,并且使原有的数据也能够 ...

  7. 对js中闭包,作用域,原型的理解

    前几天,和朋友聊天,聊到一些js的基础的时候,有一种‘好像知道,好像又不不知道怎么讲的感觉’...于是捡起书,自己理一理,欢迎拍砖. 闭包 理解闭包首先要理解,js垃圾回收机制,也就是当一个函数被执行 ...

  8. 刺透内网的HTTP代理

    从偶然出发 在做测试的时候发现了这样一个漏洞,原请求报文如下: GET / HTTP/1.1 Host: attack_website [... HEADER ...] ... 当时最初目的是想测SS ...

  9. Javascript高级编程学习笔记(76)—— 表单(4)选择文本

    文本框脚本 在HTML中文本框有两种实现方式: <input> <textarea> 这两种实现方式虽然在多数情况下表现一致,但是两者之间仍存在许多重要区别 对于<inp ...

  10. IDEA一定要懂的32条快捷键

    阅读本文大概需要 2 分钟.   作者:帝都羊 这些IntelliJ IDEA键盘快捷键可以让你专注于编写代码,让你的双手在键盘上起舞. 1.搜索文件名: ↑   Shift 快速连续按两下 2.显示 ...