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 相关文章推荐
通用JS事件写法实现代码
Jan 07 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
jquery实现的判断倒计时是否结束代码
Feb 05 Javascript
特殊日期提示功能的实现方法
Jun 16 Javascript
纯JS前端实现分页代码
Jun 21 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
AngularJs ng-change事件/指令的用法小结
Nov 01 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
使用gulp构建前端自动化的方法示例
Dec 25 Javascript
mocha的时序规则讲解
Feb 16 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
详解webpack-dev-middleware 源码解读
Mar 23 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 GUID生成函数和类
2014/03/10 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
教你php如何实现验证码
2016/01/20 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
js三种排序算法分享
2012/08/16 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
Python表示矩阵的方法分析
2017/05/26 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
分析经典Python开发工程师面试题
2019/04/08 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
乡镇干部十八大感言
2014/02/17 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
汇报材料怎么写
2014/12/30 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
新闻通讯稿范文
2015/07/22 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android