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 CSS画图之基础篇
Jul 29 Javascript
JavaScript 变量基础知识
Nov 07 Javascript
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
javascript实现2016新年版日历
Jan 25 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
jQuery实现的瀑布流加载效果示例
Sep 13 Javascript
JavaScript简单计算人的年龄示例
Apr 15 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
Jul 12 Javascript
Layui多选只有最后一个值的解决方法
Sep 02 Javascript
vue中 数字相加为字串转化为数值的例子
Nov 07 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php中iconv函数使用方法
2008/05/24 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
每天一篇javascript学习小结(RegExp对象)
2015/11/17 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
数据管理员的自我评价分享
2013/11/15 职场文书
人力资源管理毕业生自荐信
2013/11/21 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
授权委托书(完整版)
2014/09/10 职场文书
道德模范事迹材料
2014/12/20 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python