使用jquery Ajax实现上传附件功能


Posted in jQuery onOctober 23, 2018

用过jquery的Ajax的人肯定都知道,Ajax的默认编码方式是”application/x-www-form-urlencoded“,此编码方式只能编码文本类型的数据,因此Ajax发送请求的时候,会把data序列化成 一个个String类型的键值对,此种传输数据的方式能够满足大部分应用场景,然而当传输的数据里有附件的时候,此序列化机制便是我们的绊脚石。Ajax本身的序列化机制的硬伤归其原因在于在html4的时代,没有FileReader接口,在页面里无法读取File(Blob)文件,用document.getElementById("文件控件的id").value只能拿到文件的name,因此去序列化去编码它也无从谈起(个人观点,有不同意见的欢迎给我留言)。

众所周知,用form提交表单的时候,有附件的时候,只要设置form的enctype="multipart/form-data",便可以上传附件。于是博主想到,若是能用Ajax提交一个form,那上传附件岂不是变的简单,再也不需要使用类似AjaxFileUpload之类的插件来作上传。html5让这一切便的简单。

FormData是html5的接口,使用它一行代码便可以拿到整个form表单对象:

     var form = new FormData(document.getElementById("form"));

然后我们拿着这个form对象,去赋给Ajax的data,并且阻止它将参数转成成String类型的键值对,此举需要设置processData属性为false,此属性默认为true;同时设置Ajax的编码方式为false(contentType: false),在form表单里已经设置了编码方式,Ajax的编码机制已经不需要,这样我们就可以用Ajax去提交一个form对象,从而解决表单有附件的问题。需要注意的是,务必将Ajax的提交方式,设置为post,get请求只能携带几kb的数据。若是不设置processData为false,去提交带附件的form同样是提交不上去的,它的序列化机制是硬伤。所以提交的时候,只能不使用它的序列化机制。

一言以蔽之:借Ajax的壳,去提交form。

示例如下:

<!DOCTYPE html>
<html>
<head>
  <script src="js/jquery-1.9.1.min.js"></script>
  <meta charset="utf-8" />
  <title>Ajax提交form</title>
  <script type="text/javascript">
  function test(){
   var form = new FormData(document.getElementById("form"));
   $.ajax({
   url:"接口地址",
   type:"post",
   data:form,
   cache: false,
   processData: false,
   contentType: false,
   success:function(data){
      alert("操作成功!");
   },
   error:function(e){
     alert("网络错误,请重试!!");
    }
   });    
  }
</script>
</head>
<body>
<form id="form" enctype="multipart/form-data">
  <input type="text" id="name" name="name" />
  <input type="text" id="phone" name="phone" />
  <input type="text" id="content" name="content" />
  <input type="text" id="price" name="price" />
  <input type="text" id="ifPhone" name="ifPhone" />
  <input type="text" id="ifCerName" name="ifCerName" />
  <input type="text" id="endTime" name="endTime" />
  <input type="text" id="type" name="type" />
<input type="file" id="fileAttach" name="fileAttach" />
<input type="button" onclick="test()" value="上传" />
</form>
</body>
</html>

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

jQuery 相关文章推荐
jQuery实现百度登录框的动态切换效果
Apr 21 jQuery
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
最常用的jQuery表单验证(简单)
May 23 jQuery
jQuery实现动态删除LI的方法
May 30 jQuery
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
jQuery实现模糊查询的方法分析
May 10 jQuery
jQuery实现的滑块滑动导航效果示例
Jun 04 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
简单易扩展可控性强的Jquery转盘抽奖程序
Mar 16 jQuery
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
javascript异步处理与Jquery deferred对象用法总结
Jun 04 jQuery
jQuery 选择器用法实例分析【prev + next】
May 22 jQuery
jquery实现动态添加附件功能
Oct 23 #jQuery
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 #jQuery
jQuery轻量级表单模型验证插件
Oct 15 #jQuery
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 #jQuery
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
Oct 10 #jQuery
jquery.param()实现数组或对象的序列化方法
Oct 08 #jQuery
jQuery实现点击图标div循环放大缩小功能
Sep 30 #jQuery
You might like
用Flash图形化数据(一)
2006/10/09 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
Vuex提升学习篇
2018/01/11 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python 的内置字符串方法小结
2016/03/15 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
tensorflow 变长序列存储实例
2020/01/20 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
学院书画协会部门职责
2013/11/28 职场文书
通信生自我鉴定
2014/01/18 职场文书
应聘面试自我评价
2014/01/24 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
个人自我鉴定总结
2014/03/25 职场文书
小学生常见病防治方案
2014/06/06 职场文书
初中班级口号
2014/06/09 职场文书
小学假期安全广播稿
2014/09/28 职场文书
房产分割协议书范文
2014/11/21 职场文书
民事纠纷协议书
2016/03/23 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL