使用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的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
jQuery实现切换隐藏与显示同时切换图标功能
Oct 29 jQuery
jquery中有哪些api jQuery主要API
Nov 20 jQuery
jQuery插件Validation表单验证详解
May 26 jQuery
jQuery滑动效果实现方法分析
Sep 05 jQuery
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
jquery的$().each和$.each的区别
Jan 18 jQuery
jQuery+ajax实现批量删除功能完整示例
Jun 06 jQuery
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
搭建简单的nodejs http服务器详解
2017/03/09 NodeJs
ES6入门教程之let和const命令详解
2017/05/17 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
django框架auth模块用法实例详解
2019/12/10 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
机械专业毕业生推荐信范文
2013/11/25 职场文书
寒假思想汇报
2014/01/10 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
学校运动会开幕词
2016/03/03 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
Python打包为exe详细教程
2021/05/18 Python
AngularJS实现多级下拉框
2022/03/25 Javascript