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 19 Javascript
jQuery遍历Form示例代码
Sep 03 Javascript
JavaScript常用脚本汇总(二)
Mar 04 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
jQuery动态背景图片效果实现方法
Jul 03 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
javascript如何写热点图
Dec 08 Javascript
AngularJS 2.0新特性有哪些
Feb 18 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
vue-cli 首屏加载优化问题
Nov 06 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 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
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
取选中的radio的值
2010/01/11 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
Vue页面骨架屏的实现方法
2018/05/22 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
Python构造函数及解构函数介绍
2015/02/26 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
python中文乱码不着急,先看懂字节和字符
2017/12/20 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
动物学专业毕业生求职信
2013/10/11 职场文书
农场厂长岗位职责
2013/12/28 职场文书
超市促销活动方案
2014/03/05 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2015年检验科工作总结
2015/04/27 职场文书
python缺失值填充方法示例代码
2022/12/24 Python