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里面指定。

前端将二进制数据流转为文件_前端通过二进制流下载文件相关推荐

  1. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...

    在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...

  2. java线程下载文件_使用多线程在Java下载文件

    我正在做一个类似IDM的下载器,我已经读到了这篇关于它的文章.我已经实现了我的第一步代码. 下面是Downloader类的代码:package download.manager; import jav ...

  3. 使用python下载文件_详解使用Python下载文件的几种方法

    在使用Python进行数据抓取的时候,有时候需要保持文件或图片等,在Python中可以有多种方式实现.今天就一起来学习下. urllib.request 主要使用的是urlretrieve方法,该方法 ...

  4. linux下载文件夹到本地命令行,linux下载文件到本地命令,linux下载文件到本地命令 下载工具...

    linux下载文件到本地命令,linux下载文件到本地命令 下载工具 来源:互联网/编辑:佚名/时间:2020-09-08 在手机上看 扫一扫进入手机端 linux用户命令在哪个文件夹下 用 whic ...

  5. msf后渗透之文件交互指令、上传下载文件、屏幕截图、键盘记录、创建账户、音频录像和提权(上)

    目录 1.文件交互指令 2.上传下载文件(windows) 3.屏幕截图(windows) 4.键盘记录(windows) 1.先启动记录keyscan_start 2.显示键盘输入内容keyscan ...

  6. css初始化样式文件_前端必备技能 webpack 4. webpack处理CSS资源

    每篇文章纯属个人经验观点,如有错误疏漏欢迎指正   因为 webpack 本身只具有识别 JS 的能力,所以涉及到其他资源,需要我们通过 loader 来进行特殊处理,针对不同的样式资源,需要以下几个 ...

  7. 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景

    Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...

  8. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?

    在每个前端求职者的面试过程中,一定都有过被面试官问到项目中的难点,而答不上来的情况.为了让大家在前端面试前准备得更加充足,小编准备了一些易被忽视且难度较高的前端面试题,希望可以帮助大家更加顺利完成求职 ...

  9. 前端工程师需要学习ps 吗_前端人员一定要掌握的PS技巧

    一.PS与前端知多少 一般我们会认为PS是用来修改图片的,这些工作是美工人员做的事不是前端人员做的,其实这样想你就错了,因为在前端人员也是要学会一些简单的关于PS的技巧的,这样就不会应为一点点小小的需 ...

最新文章

  1. 文本间加入任意字符的PHP函数
  2. 蓝鸥Unity开发基础——Switch语句学习笔记
  3. 中文发音关系频谱的猜想
  4. DPDK vhost-user之前后端通知机制场景分析(十)
  5. Excel公式与函数案例速查手册/电脑技巧从入门到精通丛书
  6. 开户oracle监听,R12:银行账户开户人?
  7. B13_NumPy数学函数(三角函数,舍入函数)
  8. [POI2011]MET-Meteors 整体二分_树状数组_卡常
  9. 好雨云帮如何对接Git Server
  10. java String对象转Base64
  11. if else 与 switch case
  12. DTCMS自定义标签,获取所有栏目文章列表TOP,以及文章通用URL
  13. iOS 中client和server的 Web Service 网络通信 (2)
  14. webpack分离打包css和less
  15. windows系统下帧率获取工具--fraps
  16. python继承方式是基于原型吗_【Python】python 普通继承方式和super继承方式
  17. linux使用163的yum源配置
  18. 2020 全国省份数据整理
  19. Docker - Docker Image及Image命令详解
  20. 跟着Vam一起学习Typescript(第一期)(更新中)

热门文章

  1. java rsa内容超长_RSA 非对称加密解密,超长字符串分块处理
  2. 深度学习之基于Xception实现四种动物识别
  3. K for the Price of One(EASY HARD)
  4. Leet Code题解 - 1559. Detect Cycles in 2D Grid 检测二维无向图中的环
  5. 上海库源电气OrCAD视频教程
  6. PAT_B_1057_Java(20分)
  7. 重写toString()方法(Java篇)
  8. 图形推理1000题pdf_普华永道 网申笔试 OT 含泪总结归纳 - 逻辑推理
  9. 禁止服务器的协议,启用或禁用服务器网络协议
  10. 【图像超分辨率】Learning Texture Transformer Network for Image Super-Resolution