使用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.ajax向后台传递数组问题的解决方法
May 12 jQuery
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
jQueryUI Sortable 应用Demo(分享)
Sep 07 jQuery
基于jQuery选择器之表单对象属性筛选选择器的实例
Sep 19 jQuery
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 jQuery
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
jQuery EasyUI 折叠面板accordion的使用实例(分享)
Dec 25 jQuery
jquery.pagination.js分页使用教程
Oct 23 jQuery
JQuery中DOM节点的操作与访问方法实例分析
Dec 23 jQuery
Jquery cookie插件实现原理代码解析
Aug 04 jQuery
jquery实现点击左右按钮切换图片
Jan 27 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
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
js实现自定义路由
2017/02/04 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
跟老齐学Python之类的细节
2014/10/13 Python
Python标准库内置函数complex介绍
2014/11/25 Python
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
python 远程统计文件代码分享
2015/05/14 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
python 下载文件的几种方法汇总
2021/01/06 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
打架检讨书400字
2014/01/17 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
水电维修专业推荐信
2014/09/06 职场文书
大学生就业意向书
2015/05/11 职场文书