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 相关文章推荐
在线编辑器的实现原理(兼容IE和FireFox)
Mar 09 Javascript
我的javascript 函数链之演变
Apr 07 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 Javascript
javascript基础知识
Jun 07 Javascript
封装获取dom元素的简单实例
Jul 08 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 Javascript
在vue-cli项目中使用bootstrap的方法示例
Apr 21 Javascript
聊聊Vue中provide/inject的应用详解
Nov 10 Javascript
Vue之封装公用变量以及实现方式
Jul 31 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 使用post,get的一种简洁方式
2010/04/25 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
php英文单词统计器
2016/06/23 PHP
javascript面向对象编程代码
2011/12/19 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
一个小时快速搭建微信小程序的方法步骤
2019/04/15 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
python编码总结(编码类型、格式、转码)
2016/07/01 Python
python安装Scrapy图文教程
2017/08/14 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
如何给Python代码进行加密
2020/01/10 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
《陈涉世家》教学反思
2014/04/12 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
Python爬取某拍短视频
2021/06/11 Python
python文件与路径操作神器 pathlib
2022/04/01 Python
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python