Emberjs 通过 axios 下载文件的方法


Posted in Javascript onSeptember 03, 2019

摘要: 目前项目中需要与后端合作,通过发送 GET 请求,后端返回文件流,前端进行文件的下载。

使用到的技术有:

  1. Emberjs
  2. axios

思路

接到这个需求的话,想着使用创建 a 链接,然后模拟点击 a 链接来完成下载,但是情况不是这样的。后端有多于一个的下载接口,首先是生成下载文件的接口, 这个接口主要是返回 需要下载的文件的 name 以及相应的接口地址。而下载的文件可能不止一个,同时,对文件接口地址发送 GET 请求,会返回文件流,但是我们需要的是 CSV 格式的文件,所以想到通过 axios 来实现这个需求。

具体做法

既然方向确定了,那就是去做了。

在项目中安装插件/导入 axios

现在 Emberjs 封装好的 axios 插件 - ember-axios ,使用 ember install axios 。这个插件没有文档,所以只能看源码,还好源码比较简单,就是简单的将 axios 的一些方法封装成一个 service 内的方法。

在项目文件中引入 axios

安装后在 Emberjs 项目中将此 service 引入近来

import { inject as service } from '@ember/service';

export default Controller.extend({
 // ...
 axios: service()
 // ...
});

这样即可使用这个插件中封装的一些 axios 的方法。

使用

之前也说过当前项目需要先发送一个请求,请求文件的接口地址。返回的值的格式为:

{
 "fileNames":[
  "filename=downloadFile1.csv",
  "filename=downloadFile2.csv"
 ],
 "status":"ok"
}

可以看到,如我们所想的那样,返回的并不一定是单个文件的地址,所以我们在接收到这个数据后:

import { isEmpty } from '@ember/utils';
import { all, reject } from 'rsvp';
//...
.then(data=> {
 if (data.status !== 'ok' || isEmpty(data.fileNames)) {
  return reject();
 }
 return all(data.fileNames.map(ele => {
  return axios.axios({
   url: `${ele}`,
   method: 'get',
   responseType: 'blob'
  });
 }));
});

在等待上面的请求发送成功之后,我们看看这段代码的意思。最上面的两个 import 是引入的一些 Emberjs 中封装的一些通用方法以及 promies 方法.在 then 之内的代码,先是验证是否返回成功。然后对数据进行遍历,并发送 axios 封装的 get 请求。 其中 axios.axios() ember-axios 封装的 axios.create(this.config()) 源码地址 ,同时注意的是 config 对象中 responseType 填写的是 blob ,这是保证文件能够下载成功的基础。

请求发送成功之后,我们需要对返回的数据进行处理,也就是:

.then(data => {
 data.forEach((res, index) => {
  const content = res.data,
   blob = new Blob([content], { type: 'text/csv' }),
   fileName = fileNames[index];

  if ('download' in document.createElement('a')) { // 非IE下载
   const elink = document.createElement('a');

   elink.download = fileName;
   elink.style.display = 'none';
   elink.href = URL.createObjectURL(blob);
   document.body.appendChild(elink);
   elink.click();
   URL.revokeObjectURL(elink.href); // 释放URL 对象
   document.body.removeChild(elink);
  } else { // IE10+下载
   navigator.msSaveBlob(blob, fileName);
  }
 });
}).catch(() => {
});

这段代码需要注意的是我们 new Blob() 接收的是 res.data 这个需要特别注意。另外就是此方法的第二个参数接收的 {type: 'text/csv'} ,因为次项目下载的是 csv 文件格式,其他的可以参考 MIME . 其他的就是创建一个 display:none 的 a 标签,并触发点击事件。这时候浏览器就会进行下载。

总结

这算是在 Embjerjs 中进行下载流文件的一次船新尝试。

以上所述是小编给大家介绍的Emberjs 通过 axios 下载文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
AngularJS入门教程(一):静态模板
Dec 06 Javascript
Javascript中String的常用方法实例分析
Jun 13 Javascript
详解JavaScript中的表单验证
Jun 16 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
jquery zTree异步加载简单实例讲解
Feb 25 Javascript
浅谈JsonObject中的key-value数据解析排序问题
Dec 06 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 Javascript
Node.js net模块功能及事件监听用法分析
Jan 05 Javascript
js实现无缝滚动双图切换效果
Jul 09 Javascript
微信小程序实现一张或多张图片上传(云开发)
Sep 25 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
Sep 26 Javascript
vue 自动化路由实现代码
Sep 03 #Javascript
vue中npm包全局安装和局部安装过程
Sep 03 #Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 #jQuery
Webpack中loader打包各种文件的方法实例
Sep 03 #Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 #Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 #jQuery
js tab栏切换代码实例解析
Sep 03 #Javascript
You might like
德生H-501的评价与改造
2021/03/02 无线电
3
2006/10/09 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
自己的js工具 Event封装
2009/08/21 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python实现购物车程序
2018/04/16 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python实发邮件实例详解
2019/11/11 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
财经学院自荐信范文
2014/02/02 职场文书
小学生新年寄语
2014/04/03 职场文书
乐山大佛导游词
2015/02/02 职场文书
学生逃课检讨书
2015/02/17 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
小学毕业感言100字
2015/07/30 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
Python3.10的一些新特性原理分析
2021/09/15 Python