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

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

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

html:

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

JS:

图片上传&删除方法:

uploadImgObjectCss.prototype = {
init: function () {
var _this = this;
_this.removeImg();
_this.upFileEleChange();
},
upFileEleChange: function () {
var _this = this;
_this.upFileEle.bind("change", function () {
_this.setImagePreview();
_this.removeImg(); });
},
//图像数据收集及预览--最多上传4张
setImagePreview: function () {
var _this = this;
var docObj = _this.upFileEle[0];
for (i = 0; i < 4; i++) {
var imgObjPreview = new Image();
if (docObj.files && docObj.files[i]) {
imgObjPreview.src = window.URL.createObjectURL(docObj.files[i]);
if (_this.upimgOuter.children("li:not(.add)").size() <= 3) {
//判断files是否存在相同的图片
var isExist = false;
for (var f = 0; f < _this.files.length; f++) {
if (_this.files[f].name == docObj.files[i].name) {
isExist = true;
}
}
if (!isExist) {
_this.upimgOuter.find(".add").before($("<li><i></i></li>").append($("<div></div>").append($(imgObjPreview))));
_this.files.push(docObj.files[i]);
}
}
};
}; if (_this.upimgOuter.children("li:not(.add)").size() >= 4) {
_this.upimgOuter.find(".add").hide();
};
},
//删除图片
removeImg: function () {
var _this = this;
var $revPhotoI = $(".upimg-outer li i");
$revPhotoI.bind("click", function () {
var index = _this.upimgOuter.find("i").index(this);
if (index > -1) {
_this.files.splice(index, 1); //从files移除下标从index开始往下1个元素
$(this).parent("li").remove();
if (_this.upimgOuter.children("li:not(.add)").size() >= 4) {
_this.upimgOuter.find(".add").hide();
} else {
_this.upimgOuter.find(".add").show();
}
}
});
}
}

提交方法:

var formData = new FormData();
formData.append("OrderID", _this.orderID);
formData.append("Content", $(window.OrderComplaintCache.textareaContent).val());
for (var i = 0; i < _this.uploadImgObjectCss1.files.length; i++) {
//formData.append("fileArray", _this.uploadImgObjectCss1.files[i]);
formData.append("file" + i, _this.uploadImgObjectCss1.files[i]);
}
$.ajax({
type: "post",
url: "/ajax/usercenterHandler.js?action=complaintorder",
data: formData,
processData: false, //必须
contentType: false, //必须
success: function (json) {
var data = null;
try {
data = JSON.parse(json);
} catch (e) {
data = new Function("return " + json + "")();
}
_this.fadeOutIconMessage("message-submit-succ", window.OrderComplaintCache.successMessage, 3000, function () {
window.history.go(-1);
});
}

这里要注意几点:

  • 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]);

  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  Java  面向对象的编程语言:为了实现人机交互需要语言的过渡(翻译)这时就需要Java虚拟机! 不同系统需要不同的虚拟机 2  学习语言第一件事 搭建环境(运行 Java需要的环境) 在甲骨文 ...

  2. Shader_ShaderForge_NGUI_序列帧/

    序列帧 Shader篇 Shader Forge序列帧算法! 附上Shader代码部分: // Shader created with Shader Forge v1.26 // Shader For ...

  3. [转]Ubuntu Precise - Install youtube-dl package using Quantal repo

    Ubuntu Precise - Install youtube-dl package using Quantal repo Ubuntu Precise 12.04 currently contai ...

  4. 解析.NET对象的跨应用程序域访问(上篇)

    在目前的项目开发中,分布式开发已经逐渐成为主流.一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目.这句话虽然有些过激,但是随着人们对效率的要求在提高,以及产品需要提升用户体验.只有 ...

  5. FFmpeg 学习(二):Mac下安装FFmpeg

    一.安装ffmpeg 分为两种安装方式: 1. 命令行安装 brew install ffmpeg 2. 下载压缩包安装 去 http://evermeet.cx/ffmpeg/ 下载7z压缩包,解压 ...

  6. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  7. Javascript高级编程学习笔记(51)—— DOM2和DOM3(3)操作样式表

    操作样式表 在JS中样式表用一种类型来表示,以便我们在JS对其进行操作 这一类型就是CSSStyleSheet 即CSS样式表类型,包括了之前 style 对象所不包括的外部样式表以及嵌入样式表 其中 ...

  8. Python学习笔记【第九篇】:Python面向对象基础

    Python语言中一切皆对象(类.属性.方法.........) 概念 面向对象编程:Object Oriented Programming 简称OOP 面向对象程序设计 面向对象和面向过程都是解决问 ...

  9. OAuth2简易实战(一)-四种模式

    1. OAuth2简易实战(一)-四种模式 1.1. 授权码授权模式(Authorization code Grant) 1.1.1. 流程图 1.1.2. 授权服务器配置 配置授权服务器中 clie ...

  10. Linux(Centos平台)RabbitMQ消息中间件服务器搭建

    本篇结合接口测试平台部署来讲,不了解的请先查看我的另一篇文档,HttpRunnerManager接口测试平台部署在服务器上(Centos + python3.6 + Mysql5.7 + uwsgi ...