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 相关文章推荐
JavaScript中实现块作用域的方法
Apr 01 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
jQuery插件 selectToSelect使用方法
Oct 02 Javascript
分享一款基于jQuery的视频播放插件
Oct 09 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
May 19 Javascript
jQuery实现的仿百度分页足迹效果代码
Oct 30 Javascript
JavaScript中各种引用类型的常用操作方法小结
May 05 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
Jun 03 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
webpack4.0打包优化策略整理小结
Mar 30 Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
ES6 Symbol数据类型的应用实例分析
Jun 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
Vue页面骨架屏注入方法
2018/05/13 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
python解析xml文件实例分享
2013/12/04 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
python批量修改xml属性的实现方式
2020/03/05 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
运动会入场词50字
2014/02/20 职场文书
期末学生评语大全
2014/04/24 职场文书
开学第一周总结
2015/07/16 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python