使用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实现全选、全不选以及单选功能
Mar 23 jQuery
如何编写jquery插件
Mar 29 jQuery
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 jQuery
解决IE7中使用jQuery动态操作name问题
Aug 28 jQuery
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
jQuery实现对网页节点的增删改查功能示例
Sep 18 jQuery
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
Feb 27 jQuery
jquery分页优化操作实例分析
Aug 23 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP序列化操作方法分析
2016/09/28 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
Python面向对象class类属性及子类用法分析
2018/02/02 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
打造完美自荐信
2014/01/24 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
退税申请报告怎么写
2015/05/18 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
Pandas自定义选项option设置
2021/07/25 Python