使用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实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
jQuery导航条固定定位效果实例代码
May 26 jQuery
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
jquery tmpl模板(实例讲解)
Sep 02 jQuery
jQuery实现的form转json经典示例
Oct 10 jQuery
jQuery插件Validation表单验证详解
May 26 jQuery
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
jQuery访问json文件中数据的方法示例
Jan 28 jQuery
jQuery实现弹幕特效
Nov 29 jQuery
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
jQuery+ThinkPHP实现图片上传
Jul 23 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
PHP伪静态写法附代码
2008/06/20 PHP
php将会员数据导入到ucenter的代码
2010/07/18 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
php 如何获取数组第一个值
2013/08/06 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
Python中Threading用法详解
2017/12/27 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
临床医学应届生求职信
2013/11/06 职场文书
我的求职计划书
2014/01/10 职场文书
先进个人获奖感言
2014/01/24 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
保护动物的宣传语
2015/07/13 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
Golang 入门 之url 包
2022/05/04 Golang