Angular利用HTTP POST下载流文件的步骤记录


Posted in Javascript onJuly 26, 2020

Angular / Vue HTTP POST下载流文件

HTTP POST 请求流文件转成excel

在使用Angular开发项目时,通常会有下载文件的功能项。一般是后台返回下载地址,通过 <a> 标题或者使用 window 打开下载地址新窗口,浏览器则会识别出流文件进行文件下载。

但是,有时候进行http异步请求,后台返回的并不是下载地址,而是直接返回一个文件流,这时如何使用http请求回来的文件流转换成文件下载?

其实并非Angular框架存地这样的情况,其他PWA如Vue,React甚至Jquery都通过http xhr进行请求而获取的流文件,浏览器也并不会自动识别并自动下载。

那当然,肯定有解决方案。

方案思路:

http请求使用blob的返回类型,获取文件流后,对数据进行Blob,再提交给浏览器进行识

下面是代码示例

/**
 * 导出excel
 */
exportExcel(){
 const params = {}; // body的参数
 const queryParams = undefined; // url query的参数
 this.http.post(this.exportUrl, params, queryParams, {
 responseType: "blob",
 headers: new HttpHeaders().append("Content-Type", "application/json")
 }).subscribe(resp=>{
 // resp: 文件流
 this.downloadFile(resp);
 })
}

/**
 * 创建blob对象,并利用浏览器打开url进行下载
 * @param data 文件流数据
 */
downloadFile(data) {
 // 下载类型 xls
 const contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
 // 下载类型:csv
 const contentType2 = 'text/csv';
 const blob = new Blob([data], { type: contentType });
 const url = window.URL.createObjectURL(blob);
 // 打开新窗口方式进行下载
 // window.open(url); 

 // 以动态创建a标签进行下载
 const a = document.createElement('a');
 const fileName = this.datePipe.transform(new Date(), 'yyyyMMdd');
 a.href = url;
 // a.download = fileName;
 a.download = fileName + '.xlsx';
 a.click();
 window.URL.revokeObjectURL(url);
}

总结

到此这篇关于Angular利用HTTP POST下载流文件的文章就介绍到这了,更多相关Angular用HTTP POST下载流文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
Jquery 的扩展方法总结
Oct 01 Javascript
JS 实现Json查询的方法实例
Apr 12 Javascript
JS实现点击下载的小例子
Jul 10 Javascript
jquery Tab效果和动态加载的简单实例
Dec 11 Javascript
JavaScript反弹动画效果的实现代码
Jul 13 Javascript
使用Node.js实现ORM的一种思路详解(图文)
Oct 24 Javascript
Angular中使用MathJax遇到的一些问题
Dec 15 Javascript
jQuery动态生成的元素绑定事件操作实例分析
May 04 jQuery
vuex实现数据状态持久化
Nov 11 Javascript
你知道JavaScript Symbol类型怎么用吗
Jan 08 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 Javascript
vue中keep-alive、activated的探讨和使用详解
Jul 26 #Javascript
关于angular浏览器兼容性问题的解决方案
Jul 26 #Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
Jul 26 #Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 #Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
Jul 26 #Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 #Javascript
vuex分模块后,实现获取state的值
Jul 26 #Javascript
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP中的类-什么叫类
2006/11/20 PHP
改变Apache端口等配置修改方法
2008/06/05 PHP
PHP中读写文件实现代码
2011/10/20 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python处理html转义字符的方法详解
2016/07/01 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
Django中ORM的基本使用教程
2020/12/22 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
"序列点" 是什么
2016/07/29 面试题
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
女性励志书籍推荐
2019/08/19 职场文书
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android