前端将二进制数据流转为文件_前端通过二进制流下载文件
JS下载文件两种方式总结:
下载文件主要分为两种形式,具体使用哪种方式取决于后台;
1.如果后台服务器的静态目录有可供下载的静态资源,后台接口返回文件路径,直接window.location.href=url或者window.open(url)或者创建a标签并指定a.href=url模拟点击进行下载即可;
2.如果后台服务器无可供下载的静态资源,返回的是一个文件流(response-type: application/octet-stream;charset=UTF-8 ),则使用第二种方式(将文件写入内存,并且创建a元素,a链接href属性指向内存中的文件,download属性指向要下载的文件名,模拟a元素的点击事件进行下载然后移除a元素)。
本文主要说明采用文件流的方式下载文件。
一、后台服务器有静态资源且是固定的文件名(GET方式下载文件)
window.location.href="http://www.域名/template.xlsx(请求返回的url地址)"
二、后台返回文件流
方案1:采用FileReader读取二进制流,下载读取后的结果
import axios from 'axios'
axios.post(this.$globalConf.atapPathPrefix + '/system/indicator/export', postParams, { responseType: 'blob' }).then(res => {
let blob = res.data;
let reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function(e) {
let a = document.createElement('a');
let fileName = res.headers["content-disposition"] ? res.headers["content-disposition"].split(';')[1].split('=')[1] : new Date().getTime() + '.xlsx'
a.download = decodeURIComponent(fileName)//解码
a.href = e.target.result;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
})
方案二:通过URL.createObjectURL读取二进制流并返回一个对象URL,原理同上
import axios from 'axios'
axios.post(this.$globalConf.atapPathPrefix + '/system/indicator/export', postParams, { responseType: 'blob' }).then(res => {
//这里res.data是返回的blob对象,即对应的二进制流
let blob = res.data
let downloadElement = document.createElement('a');
let href = window.URL.createObjectURL(blob); //创建下载的链接
let fileName = res.headers["content-disposition"] ? res.headers["content-disposition"].split(';')[1].split('=')[1] : new Date().getTime() + '.xlsx'
downloadElement.href = href;
downloadElement.download = decodeURIComponent(fileName)//解码
document.body.appendChild(downloadElement);
downloadElement.click();
document.body.removeChild(downloadElement);
window.URL.revokeObjectURL(href); //释放掉blob对象
})
可能出现的问题:
无法获取headers的content-disposition字段
本次请求获取到fileName如下:
image.png
解决办法
在服务端设置header
Access-Control-Expose-Headers: Content-Disposition
(3)Access-Control-Expose-Headers
该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
前端将二进制数据流转为文件_前端通过二进制流下载文件相关推荐
- xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...
在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...
- java线程下载文件_使用多线程在Java下载文件
我正在做一个类似IDM的下载器,我已经读到了这篇关于它的文章.我已经实现了我的第一步代码. 下面是Downloader类的代码:package download.manager; import jav ...
- 使用python下载文件_详解使用Python下载文件的几种方法
在使用Python进行数据抓取的时候,有时候需要保持文件或图片等,在Python中可以有多种方式实现.今天就一起来学习下. urllib.request 主要使用的是urlretrieve方法,该方法 ...
- linux下载文件夹到本地命令行,linux下载文件到本地命令,linux下载文件到本地命令 下载工具...
linux下载文件到本地命令,linux下载文件到本地命令 下载工具 来源:互联网/编辑:佚名/时间:2020-09-08 在手机上看 扫一扫进入手机端 linux用户命令在哪个文件夹下 用 whic ...
- msf后渗透之文件交互指令、上传下载文件、屏幕截图、键盘记录、创建账户、音频录像和提权(上)
目录 1.文件交互指令 2.上传下载文件(windows) 3.屏幕截图(windows) 4.键盘记录(windows) 1.先启动记录keyscan_start 2.显示键盘输入内容keyscan ...
- css初始化样式文件_前端必备技能 webpack 4. webpack处理CSS资源
每篇文章纯属个人经验观点,如有错误疏漏欢迎指正 因为 webpack 本身只具有识别 JS 的能力,所以涉及到其他资源,需要我们通过 loader 来进行特殊处理,针对不同的样式资源,需要以下几个 ...
- 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景
Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...
- 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?
在每个前端求职者的面试过程中,一定都有过被面试官问到项目中的难点,而答不上来的情况.为了让大家在前端面试前准备得更加充足,小编准备了一些易被忽视且难度较高的前端面试题,希望可以帮助大家更加顺利完成求职 ...
- 前端工程师需要学习ps 吗_前端人员一定要掌握的PS技巧
一.PS与前端知多少 一般我们会认为PS是用来修改图片的,这些工作是美工人员做的事不是前端人员做的,其实这样想你就错了,因为在前端人员也是要学会一些简单的关于PS的技巧的,这样就不会应为一点点小小的需 ...
最新文章
- 文本间加入任意字符的PHP函数
- 蓝鸥Unity开发基础——Switch语句学习笔记
- 中文发音关系频谱的猜想
- DPDK vhost-user之前后端通知机制场景分析(十)
- Excel公式与函数案例速查手册/电脑技巧从入门到精通丛书
- 开户oracle监听,R12:银行账户开户人?
- B13_NumPy数学函数(三角函数,舍入函数)
- [POI2011]MET-Meteors 整体二分_树状数组_卡常
- 好雨云帮如何对接Git Server
- java String对象转Base64
- if else 与 switch case
- DTCMS自定义标签,获取所有栏目文章列表TOP,以及文章通用URL
- iOS 中client和server的 Web Service 网络通信 (2)
- webpack分离打包css和less
- windows系统下帧率获取工具--fraps
- python继承方式是基于原型吗_【Python】python 普通继承方式和super继承方式
- linux使用163的yum源配置
- 2020 全国省份数据整理
- Docker - Docker Image及Image命令详解
- 跟着Vam一起学习Typescript(第一期)(更新中)
热门文章
- java rsa内容超长_RSA 非对称加密解密,超长字符串分块处理
- 深度学习之基于Xception实现四种动物识别
- K for the Price of One(EASY HARD)
- Leet Code题解 - 1559. Detect Cycles in 2D Grid 检测二维无向图中的环
- 上海库源电气OrCAD视频教程
- PAT_B_1057_Java(20分)
- 重写toString()方法(Java篇)
- 图形推理1000题pdf_普华永道 网申笔试 OT 含泪总结归纳 - 逻辑推理
- 禁止服务器的协议,启用或禁用服务器网络协议
- 【图像超分辨率】Learning Texture Transformer Network for Image Super-Resolution