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 相关文章推荐
模拟用户操作Input元素,不会触发相应事件
May 11 Javascript
js left,right,mid函数
Jun 10 Javascript
node.js中的fs.createWriteStream方法使用说明
Dec 17 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
Dec 23 Javascript
JS库之Highlight.js的用法详解
Sep 13 Javascript
Angular如何在应用初始化时运行代码详解
Jun 11 Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 Javascript
微信小程序整合使用富文本编辑器的方法详解
Apr 25 Javascript
使用js在layui中实现上传图片压缩
Jun 18 Javascript
解决vue admin element noCache设置无效的问题
Nov 12 Javascript
鸿蒙系统中的 JS 开发框架
Sep 18 Javascript
微信小程序之高德地图多点路线规划过程示例详解
Jan 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
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
jQuery插件开发基础简单介绍
2013/01/07 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
Javascript缓存API
2016/06/14 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
python实现从wind导入数据
2019/12/03 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
如何基于线程池提升request模块效率
2020/04/18 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
《春天来了》教学反思
2014/04/07 职场文书
践行三严三实心得体会
2014/10/13 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书