通过Ajax使用FormData对象无刷新上传文件方法

 更新时间:2016年12月08日 16:26:51   作者:周XXXX  
这篇文章主要介绍了通过Ajax使用FormData对象无刷新上传文件方法,具有一定的参考价值,感兴趣的朋友可以了解一下。

写在前面:本文说的这个方案有浏览器兼容性问题;所有主流浏览器的较新版本已经支持这个对象了,比如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移除

②就是本文下面要说的使用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,就到这里了。

FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单"。

在 Mozilla Developer 网站 使用FormData对象 有详尽的FormData对象使用说明。

但上传文件部分只有底层的XMLHttpRequest对象发送上传请求,那么怎么通过jQuery的Ajax上传呢?

本文将介绍通过jQuery使用FormData对象上传文件。

使用<form>表单初始化FormData对象方式上传文件

HTML代码

<form id="uploadForm" enctype="multipart/form-data">
 <input id="file" type="file" name="file"/>
 <button id="upload" type="button">upload</button>
</form>

JavaScript代码

$.ajax({
 url: '/upload',
 type: 'POST',
 cache: false,
 data: new FormData($('#uploadForm')[0]),
 processData: false,
 contentType: false
}).done(function(res) {
}).fail(function(res) {});

这里要注意几点:

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

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

如果不是用<form>表单构造FormData对象又该怎么做呢?

使用FormData对象添加字段方式上传文件

HTML代码

<div id="uploadForm">
 <input id="file" type="file"/>
 <button id="upload" type="button">upload</button>
</div>

这里没有<form>标签,也没有enctype="multipart/form-data"属性。

javascript代码

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);
$.ajax({
 url: '/upload',
 type: 'POST',
 cache: false,
 data: formData,
 processData: false,
 contentType: false
}).done(function(res) {
}).fail(function(res) {});

这里有几处不一样:

  • append()的第二个参数应是文件对象,即$('#file')[0].files[0]。
  • contentType也要设置为‘false'。

从代码$('#file')[0].files[0]中可以看到一个<input type="file">标签能够上传多个文件,只需要在<input type="file">里添加multiple或multiple="multiple"属性。

服务器端读文件

从Servlet 3.0 开始,可以通过 request.getPart() 或 request.getPars() 两个接口获取上传的文件。

这里不多说,详细请参考官网教程 Uploading Files with Java Servlet Technology 以及示例The fileupload Example Application

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • iframe中使用jquery进行查找的方法【案例分析】

    iframe中使用jquery进行查找的方法【案例分析】

    这篇文章主要介绍了iframe中使用jquery进行查找的方法,结合实际案例形式较为详细的分析了jQuery结合iframe查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • jQuery实现对网页节点的增删改查功能示例

    jQuery实现对网页节点的增删改查功能示例

    这篇文章主要介绍了jQuery实现对网页节点的增删改查功能,涉及jQuery针对网页DOM节点的获取、属性修改等相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 详解jquery方法属性

    详解jquery方法属性

    这篇文章主要介绍了jquery的方法属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • jQuery隐藏和显示效果实现

    jQuery隐藏和显示效果实现

    这篇文章主要介绍了jQuery隐藏和显示效果实现的相关资料,需要的朋友可以参考下
    2016-04-04
  • jquery实现叠层3D文字特效代码分享

    jquery实现叠层3D文字特效代码分享

    本文主要介绍了jquery实现叠层3D文字特效,实现很简单
    2015-08-08
  • IE6下opacity与JQuery的奇妙结合

    IE6下opacity与JQuery的奇妙结合

    在群里看见有人贴出一个页面问opacity不支持IE6,有什么好的支持方法没。贴出第一眼就发现用了jq库,当场就想到了支持的。 但很多人回答用CSS滤镜,当我看到这个答案的时候。有些很吃惊。难道大家都不知道JQ是支持opacity兼容IE6+的吗? 开始他们都不相信。JQ怎么配合使用。于是就写了一个简单的代码给他们。
    2013-03-03
  • jQuery学习笔记之总体架构

    jQuery学习笔记之总体架构

    jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多)。如今,jQuery已经成为最流行的javascript框架,在世界前10000个访问最多的网站中,有超过55%在使用jQuery。那么作为一个前端设计师,怎么可能不来深入了解下jQuery呢,首先我们从他的总体构架开始吧
    2014-06-06
  • jquery tree 可编辑节点实现代码(jquery一句话节点菜单)

    jquery tree 可编辑节点实现代码(jquery一句话节点菜单)

    jquery tree 可编辑节点,实现的三级菜单实现代码,这里我们将为大家准备了两个。一个是锋利的jquery中的一句话导航菜单实现代码。非常不错。
    2009-11-11
  • jQuery、layer实现弹出层的打开、关闭功能

    jQuery、layer实现弹出层的打开、关闭功能

    这篇文章主要介绍了jQuery、layer实现弹出层的打开、关闭功能,需要的朋友可以参考下
    2017-06-06
  • 浅谈$(document)和$(window)的区别

    浅谈$(document)和$(window)的区别

    本人在做项目的时候遇到$(document),$(window)这两种写法立马让我蒙圈了,那么他们的区别是什么呢,在网友的帮助下,彻底了解了他们的区别,这里分享给大家。
    2015-07-07

最新评论