使用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 28 jQuery
JQuery EasyUI的一些常用组件
Jul 12 jQuery
jQuery插件DataTables分页开发心得体会
Aug 22 jQuery
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
利用JQUERY实现多个AJAX请求等待的实例
Dec 14 jQuery
jquery实现楼层滚动效果
Jan 01 jQuery
基于jQuery实现的设置文本区域的光标位置
Jun 15 jQuery
jQuery实现模糊搜索功能的方法分析
Jun 29 jQuery
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
jQuery中each遍历的三种方法实例分析
Sep 07 jQuery
jQuery表单选择器用法详解
Aug 22 jQuery
js和jquery判断数据类型的4种方法总结
Aug 28 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python日期相关操作实例小结
2019/06/24 Python
Django logging配置及使用详解
2019/07/23 Python
Python随机数函数代码实例解析
2020/02/09 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
python文件及目录操作代码汇总
2020/07/08 Python
python如何运行js语句
2020/09/09 Python
重构Python代码的六个实例
2020/11/25 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
毕业生优秀推荐信
2013/11/26 职场文书
六查六看自查材料
2014/02/17 职场文书
实验室标语
2014/06/21 职场文书
董事长助理岗位职责
2015/02/11 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang