使用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 22 jQuery
jquery实现异步加载图片(懒加载图片一种方式)
Apr 24 jQuery
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
jQuery列表检索功能实现代码
Jul 17 jQuery
jQuery扇形定时器插件pietimer使用方法详解
Jul 18 jQuery
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
jQuery中DOM操作原则实例分析
Aug 01 jQuery
JQuery获得内容和属性方法解析
May 30 jQuery
jquery实现有过渡效果的tab切换
Jul 17 jQuery
jQuery实现开关灯效果
Aug 02 jQuery
基于jquery实现彩色投票进度条代码解析
Aug 26 jQuery
jquery实现广告上下滚动效果
Mar 04 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP goto语句用法实例
2019/08/06 PHP
如何在PHP中读写文件
2020/09/07 PHP
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jQuery 选择器理解
2010/03/16 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
python获取交互式ssh shell的方法
2019/02/14 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
医学类导师推荐信范文
2013/11/19 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
社区服务活动总结
2014/05/07 职场文书
先进班组材料范文
2014/12/25 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python