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 toggle()设置CSS样式
Nov 05 Javascript
JQuery下的Live方法和$.browser方法使用代码
Jun 02 Javascript
Javascript玩转继承(二)
May 08 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
js实现手机拍照上传功能
Jan 17 Javascript
React中的render何时执行过程
Apr 13 Javascript
JS实现简单的点赞与踩功能示例
Dec 05 Javascript
javascript事件监听与事件委托实例详解
Aug 16 Javascript
十分钟教你上手ES2020新特性
Feb 12 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
PHP缓存技术的多种方法小结
2012/08/14 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
php表单处理操作
2017/11/16 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
web.py中调用文件夹内模板的方法
2014/08/26 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
对python调用RPC接口的实例详解
2019/01/03 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Tensorflow 多线程设置方式
2020/02/06 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
销售队伍口号
2014/06/11 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL