写在前面:本文说的这个方案有浏览器兼容性问题;所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+,对兼容性比较敏感的网站慎用。

在工作中遇到了一个问题:在一个页面中,有4块内容,每块内容都包含一个图片上传功能,希望可以实现一键把这四块内容都上传上去。

我没有用插件实现上传功能,就是用的input[type=file],因此就遇到一个问题就是:

  ①传统的form表单会导致页面刷新,无法实现上述功能

  ②把表单serialize()序列化用Ajax的方式提交,也无法把上传文件的文件流进行序列化,也不行

我现有的知识就搞不定了,只能求助网上的大神了,百度了一下,大概看了两个方案:

  ①在js中创建一个新form表单,把页面中原form表单copy一份,然后再用js搞一个iframe,把form表单的target设置为iframe,这样提交后返回的内容就在iframe里,最后再把form表单、iframe移除

    该方案我没有尝试,只能说个大概;参考地址:http://www.oschina.net/code/snippet_569983_11316

  ②就是本文下面要说的使用FormData对象实现

有其他思路方案的希望不吝赐教!

好,介绍完背景之后,开始介绍我们今天的主题:FormData对象。

有两种方式可以创建一个FormData对象:

  ①创建一个空的FormData对象,然后使用append()方法向该对象里添加字段

  ②使用HTML表单来初始化一个FormData对象

下面分别介绍一下:

  第一种方式:

var oMyForm = new FormData();
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456);
oMyForm.append("file", $('#file')[0].files[0]); $.ajax({
url: '/Manage/UploadImg',
type: 'POST',
cache: false,
data: oMyForm,
processData: false,
contentType: false,
async: false
}).done(function(res) {}).fail(function(res) {});

  第二种方式:

<form id="uploadForm" enctype="multipart/form-data">
<p>指定文件名: <input type="text" name="filename" value="" /></p>
<p>上传文件: <input type="file" name="file" /></ p>
<input type="button" value="上传" onclick="doUpload()" />
</form>
var formData = new FormData($('#uploadForm')[0]);
formData.append('num', '1');//可以在已有表单数据的基础上,继续添加新的键值对
$.ajax({
url: '/upload',
type: 'POST',
cache: false,
data: new FormData($('#uploadForm')[0]),
processData: false,
contentType: false
}).done(function(res) {}).fail(function(res) {});

注意:

  • Ajax的processData设置为false。因为data值是FormData对象,不需要对数据做处理。

    • 第二种方式中<form>标签加enctyp  e="multipart/form-data"属性。
  • cache设置为false,上传文件不需要缓存。
  • contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="mutipart/form-data",所以这里设置为false。

前端搞定之后,剩下的就是后端处理了。ok,就到这里了。

参考的文章:

  http://yunzhu.iteye.com/blog/2177923
  http://blog.csdn.net/zljjava/article/details/9932787
  http://www.jianshu.com/p/46e6e03a0d53
  https://developer.mozilla.org/zh-CN/docs/Web/Guide/Using_FormData_Objects

转自:https://www.cnblogs.com/zzgblog/p/5417969.html

最新文章

  1. 洛谷P3370 【模板】字符串哈希
  2. OC-SEL
  3. MySQL 如何修改字符集 utf8 改为 utf8mb4
  4. 通过runtime替换系统类实现的代码(从github开源库fdstackview中摘录)
  5. hasClass方法 动画方法说明
  6. AS3中释放优化的几条常识
  7. 微信小程序开发 -- 02
  8. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图
  9. isFile() exists() isDirectory()的区别
  10. python 内存NoSQL数据库
  11. CSS之分组选择器和嵌套选择器
  12. Python之print()函数
  13. vs2017安装和使用教程(详细)
  14. Nginx 流量带宽等请求状态统计( ngx_req_status)
  15. js 遍历
  16. waf相关
  17. 【bzoj4771】七彩树 树链的并+STL-set+DFS序+可持久化线段树
  18. JSPatch 部署安全策略
  19. jQuery Mobile中的页面加载与跳转机制
  20. HDU 5301 Buildings 数学

热门文章

  1. ajax 获取服务器返回的XML字符串
  2. python 中的 print 函数与 list函数
  3. Ajax请求参数较长导致请求失败
  4. 使用commons-net做FTP功能的异常 java.lang.ClassNotFoundException: org.apache.oro.text.regex.Malformed
  5. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
  6. [No0000FA]C# 接口(Interface)
  7. dubbo-admin2.8.4部署
  8. Java NIO 读取文件、写入文件、读取写入混合
  9. 1.7Oo局部变量和成员变量执行顺序
  10. composer命令详解