jQuery用FormData对象实现文件上传以及如何通过ajax下载文件
之前在Vue的项目里面用到过文件上传,封装好的组件用起来比较顺手,查询Element-UI文档,十八般武器样样都有,一顿操作猛如虎,一看……跑偏了(⊙o⊙)…,我的意思就是用框架实现比较简单,但是如果用jQuery的话,对原理可能会更了解一些,有需要的一起看下吧~
1. multipart/form-data
因为HTTP提供的是基于文本的通信协议,而上传文件传输的是二进制数据,所以需要使用multipart/form-data
编码格式,其HTTP消息体格式如下:
------WebKitFormBoundaryb0GZcypmEqOvNHIY
Content-Deiposition: form-data; name="file"; filename="icon.png"
Content-Type: image/png
------WebKitFormBoundaryb0GZcypmEqOvNHIY
multipart/form-data
的请求头包含一个特殊的头信息Content-Type,其值为multipart/form-data,另外需要规定一个内容分割boundary用于分割请求体中多个不同的内容:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryb0GZcypmEqOvNHIY
2. input选择并获取文件
<form>
<input type="file" id="uplfile" name="uplfile"/>
<button type="button" id="uplfileBtn">上传</button>
</form>
type="file"
的input有一个叫files
的DOM属性,可以获取到所选的文件列表(Array),数组中每一个对象都是file类型,
var files = $("#uplfile").prop('files');
3. jQuery上传文件
新版本的XMLHttpRequest对象可以使用FormData
对象管理表单数据,可以帮我们进行二进制文件的multipart/form-data编码,如下:
$("#uplfileBtn").click(function(){
var files = $("#uplfile").prop('files');
var data = new FormData();
data.append('file', files[0]); //参数名:file
$.ajax({
url: URL,
type: 'POST',
data: data,
cache: false, //禁止浏览器对该URL的缓存
contentType: false,
processData: false,
success: function(){
//后续操作
}
});
});
contentType
:jQuery中contentType默认为application/x-www-form-urlencoded
,因此传入的data会被转为默认的HTTP编码,这里我们不需要这种转换,设置为false。
processData
:jQuery会将传入的data对象转为字符串来发送HTTP请求,这里我们的data已经是FormData对象处理好的multipart/form-data编码,所以不需要转换,设置为false。
4. js中如何直接下载文件
通常在web前端需要下载服务端文件,都是通过指定<a>
标签的href属性访问服务端URL来下载保存文件的,也可以在js中:
document.location.href = Url + '?fileName=' + value;
上面这种方法用的是HTTP的GET请求,只能通过URL传参,在相对复杂的场景中(需要传多个参数在服务端动态下载指定文件),即参数比较多的时候,我们想要能够通过ajaxPOST
方式来传递参数。
但是用ajax请求的数据只能存放在JavaScript的内存中,可以通过js读取,无法保存到硬盘,因为JavaScript本身无法直接和硬盘交互。那么有什么方法可以实现呢?一向方法总比困难多,我们可以通过模拟Form表单的提交来实现POST请求下载文件,如下:
<form id="myform" action="http://blog.kwin.wang/test/xxx.do" method="post">
<input type="hidden" name="type" value="trade"/>
<input type="hidden" name="time" value="20180818"/>
<input type="hidden" name="fileName" value="a.png"/>
</form>
主动提交Form表单:
$("#myform")[0].submit();
以上就是本文全部内容了,欢迎有兴趣的朋友评论区留言交流~
jQuery用FormData对象实现文件上传以及如何通过ajax下载文件的更多相关文章
- Struts2文件上传(基于表单的文件上传)
•Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目 •Commons-Fil ...
- servlet实现文件上传,预览,下载和删除
一.准备工作 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数 ...
- 使用java的MultipartFile实现layui官网文件上传实现全部示例,java文件上传
layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用. layui文件上传示例地址:https://www. ...
- [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例
原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的. ...
- 两种文件上传的实现-Ajax和form+iframe
前言 话说现在很多很多项目需要用到文件上传,自从有了HTML5之后,上传就变的超级简单了.HTML5支持多图片上传,而且支持ajax上传,而且支持上传之前图片的预览,而且支持图片拖拽上传,而且还是纯粹 ...
- PHP多文件上传(二维数组$_FILES('文件域的名称'),move_uploaded_file(‘临时文件名’,‘新的文件名’))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Struts2实现文件上传和下载,多文件上传,限制文件大小,限制文件类型
文件上传使用的包:commons-upload-xx.jar commons-io-xx.jar 一.实现文件上传: 1.在表单空间中添 ...
- FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现
这个就看代码,哈哈哈哈哈 需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...
- AspNetCore 文件上传(模型绑定、Ajax) 两种方式 get到了吗?
就目前来说,ASP.NET Core2.1了,已经相当成熟了,希望下个项目争取使用吧!! 上传文件的三种方式("我会的,说不定还有其他方式") 模型绑定 Ajax WebUploa ...
随机推荐
- sqlplus中文问号
添加两个环境变量后重启. 1.LANG=zh_CN.GBK(GBK是这样形式的,不同编码这里的value值需要跟着改变) 2.NLS_LANG=AMERICAN_AMERICA.ZHS16GBK(这个 ...
- UVA-10570 Meeting with Aliens (枚举+贪心)
题目大意:将一个1~n的环形排列变成升序的,最少需要几次操作?每次操作可以交换任意两个数字. 题目分析:枚举出1的位置.贪心策略:每次操作都保证至少一个数字交换到正确位置上. # include< ...
- POJ 3278 Catch That Cow bfs 难度:1
http://poj.org/problem?id=3278 从n出发,向两边转移,为了不使数字无限制扩大,限制在2*k以内, 注意不能限制在k以内,否则就缺少不断使用-1得到的一些结果 #inclu ...
- ubuntu16.04 NVIDIA CUDA8.0 以及cuDNN安装
下载CUDA 官网下载按照自己的实际情况进行选择,下载合适的版本. 官方安装指南 注意这里下载的是cuda8.0的runfile(local)文件. 安装CUDA 下载完成后,解压到当前目录,切换到该 ...
- 免费获取 Kaspersky Small Office Security 90 天授权
Kaspersky Small Office Security 是卡巴斯基出品的企业版杀毒软件,目前美国官网上官方有赠送活动,能够免费获取 90 天的授权,但必须要使用美国代理. 获取地址:http: ...
- Beta阶段第1周/共2周 Scrum立会报告+燃尽图 02
作业要求与 [https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284] 相同 版本控制:https://git.coding.net/li ...
- Alpha阶段第1周 Scrum立会报告+燃尽图 06
作业要求与https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246相同 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 周 ...
- Alpha冲刺(11/10)
拖鞋旅游队团队事后诸葛亮会议 前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10054510.html 时间:2018-12-1 20:00 地 ...
- 一起玩转mysql
mysql安装 一起玩转mysql linux命令
- yaf 笔记(持续更新)
1.如果action不需要输出视图文件(如果ajax请求之类的),只需要在action里面加Yaf\DisPatcher::getInstance()->disableView(); 2.获取客 ...