引子

在HTML5没来之前,浏览器想要下载文件,可能有这么几种方式:

  1. 借助a标签,<a href="学习资料.xlsx"></a>

  2. window.location = '学习资料.xlsx'

  3. 借助浏览器插件,如flash等(没考证过)

除了第三外,前两种方法有个缺点,就是无法知道下载是否完成,因为浏览器没有给出相关的事件。但是,自从有了Blob,fetch, xhr2这些好用的API之后,ajax下载文件(小文件)就变得可行了,核心原因就在于Blob和ArrayBuffter这些API提供给了浏览器操作二进制文件的能力。接下来就开始我的表演

1. fetch方法

fetch优点有很多,比如基于promise,写起来直观易懂,缺点是IE,包括IE11全部不支持。

使用时要注意一点是,fetch请求时默认不会带上cookie,如果你的api是在登录后才能访问,记得手动设置 credentials选项。下面是下载一个文件的代码:


fetch('学习资料.xlsx', {
method: 'GET',
credentials: "same-origin"// 带上cookie
})
.then(res => res.blob()) .then(blob => {
saveAs(blob) //fileSaver.js中的方法
})

从上面可以看出,调用fetch时会返回一个promise,当promise resolve时,会传出一个Response的实例(res),这个res除了有statusstatusTextok 这几个属性用于获取服务器相应的状态值外,还有几个炫酷的方法,正式这几个方法,使浏览器可以请求的数据类型不再局限于文本,他们是:

res.blob() //返回值是一个promise,promise resolve后会拿到一个blob对象
res.json() //返回值是一个promise,promise resolve后会拿到一个json对象,无需再调用JSON.parse
res.text() //返回值是一个promise,promise resolve后会拿到一个字符串
res.formData() //返回值是一个promise,promise resolve后会拿到一个表单数据对象(formData)

所以拿到blob后,接下来就是触发浏览器的下载了,这里调用了一个saveAs函数,它来自FileSaver.js,一个不用请求api也可以触发浏览器下载动作的库,它接受一个blob对象,和一个可选的文件名称参数,就能触发下载动作。

2.xhr2方法

xhr2的兼容性比fetchAPI要好,兼容到IE10,它没有向fetch一样把难用的xhr推翻重做,而是做了一些有用的扩展,比如xhr.responseType,在发起请求前,通过设置这个属性,可以使浏览器对返回的数据进行处理,就像res的那些有用的方法一样。xhr.responseType可以取下列值:

  "arraybuffer",
"blob",
"document",
"json",
"text"

没错,就是和上面的res的那些方法殊途同归。当请求数据返回时,你可以从xhr.response拿到相应的数据。为什么不是res.responseText呢?很明显这是xhr1时期的,从这个属性只能拿到字符串,是满足不了我们的需求的。

接下来的事情就跟上面一样了,照例贴一下代码:

      var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.open('GET', url, true);
xhr.onload = function(){
var res = xhr.response;
if(res){
saveAs(res, filename);
}
}
xhr.send();

到这里,你就可以从容掌握文件下载的状态了。最后再啰嗦一句,xhr.onload也是xhr2增加的事件,有了它,再也不想用xhr.onReadyStateChange了。其他新增的事件还有'onprocess', 'onerror', 'onabort', 'onloadstart','onloadend', 'ontimeout'。(完)

如何用ajax下载文件的更多相关文章

  1. Ajax 下载文件 文件被损坏

    问题表现 Ajax 下载文件成功后,打开提示格式损坏,源代码如下: axios({ method: 'get', url: "/public/工作簿1.xlsx", // 静态资源 ...

  2. Ajax下载文件(页面无刷新)

    说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果.实质上还是通过提交form表单来返回文件流的输出. 分步实现逻辑: ajax请求服务器,访问数据库,根据 ...

  3. js之Ajax下载文件

    传统上,客户端将依靠浏览器来处理从服务器下载文件.然而,这种方法需要打开一个新的浏览器窗口,iframe或任何其他类型的不友好和黑客行为.为下载请求添加额外的头信息也很困难.更好的解决方案是使用HTM ...

  4. 怎么用ajax下载文件

    可能大家都觉得没有必要用ajax来下载东西,用window.open(url)就可以搞定 但是这有一个问题,就是这就限定了只能用GET方式来请求了: 可能你又会说GET很符合REST的要求呀. 但是如 ...

  5. jQuery用FormData对象实现文件上传以及如何通过ajax下载文件

    之前在Vue的项目里面用到过文件上传,封装好的组件用起来比较顺手,查询Element-UI文档,十八般武器样样都有,一顿操作猛如虎,一看--跑偏了(⊙o⊙)-,我的意思就是用框架实现比较简单,但是如果 ...

  6. ajax 下载文件

    原本现在文件直接通过超链接可以完成下载,但现在要在url中附带几个参数,并且这些参数要是点击事件触发时的最新值,所以这里使用ajax的方式进行下载 然而: 1.使用ajax,ajax的返回值类型是js ...

  7. 如何用 JavaScript 下载文件

    简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好. 幸好,HTML 5 里面 ...

  8. ASP.NET MVC Ajax下载文件(使用NPOI向现有的excel模板文件里面添加数据)

    View Html.DevExpress().Button(DevExpressButtonHelper.AddButton(ViewBag.Form, "Export", &qu ...

  9. ajax下载文件

    得到所有Post数据: var postData=Request.Form.ToString() 构建JS代码 // Ajax 文件下载jQuery.download = function(url, ...

随机推荐

  1. WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析

    WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析 FeatureService也称要素服务,其最大的好处就是支持在线要素编辑,并将编辑同步更新到后 ...

  2. 知识点:CSS代码语法

    css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素(如ol)不会受到 ...

  3. MapGIS SDK(C++)【基础篇】

    算法测试:Demo.Test https://www.cnblogs.com/2008nmj/p/10060847.html //例1-1 简单要素 void AppendSFeature(CSFea ...

  4. QOpenglWidget 与QGLWidget的选择

    1. QGLWidget 是Qt OpenGL模块,但是从其官方说明,推荐在Qt5.4 之后,使用QOpenglWidget版本,具体说明如下: Note: This class is part of ...

  5. 二分搜素——(lower_bound and upper_bound)

    因为每个人二分的风格不同,所以在学习二分的时候总是被他们的风格搞晕.有的人二分风格是左闭右开也就是[L,R),有的人是左开右闭的(L,R]. 二分的最基本条件是,二分的序列需要有单调性. 下面介绍的时 ...

  6. POJ1644状态转移的思想——排列组合

    m个物品放n个盒子,盒子物品都相同,问你放的方法总数是多少 看着像个排列组合,算着算着就发现我排列组合都忘得差不多啦,哎,什么时候能打败遗忘呢 然后想用dp做,但是转移的方面没有想好 看了看题解感觉这 ...

  7. MCU_存储器

    MCU的存储器用途: RAM:数据存储器,和计算机的内存差不多,主要是用来存放程序运行产生的过程数据,掉电后会丢失数据,因此程序在上电后需要进行初始化.程序中的全局变量占据着RAM中的固定空间,局部变 ...

  8. iOS图片按比例显示

    只需加这么一段代码,如下: imageView.contentMode = UIViewContentModeScaleAspectFit; imageView.autoresizesSubviews ...

  9. Spark技术的总结 以及同storm,Flink技术的对比

    spark总结 1.Spark的特点: 高可伸缩性 高容错 基于内存计算 支持多种语言:java,scala,python,R 高质量的算法,比MapReduce快100倍 多种调度引擎:可以运行于Y ...

  10. WPF的xaml中特殊字符表示

    直接看表,描述很清晰 字符 转义字符 备注 & (ampersand) & 这个没什么特别的,几乎所有的地方都需要使用转义字符 > (greater-than character ...