后端返回Blob对象(文件流),完成导出、下载功能:

1.介绍Blob

Blob

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

JS 下载文件

下载文件分为两种形式,哪两种方式取决于后台;

  • 如果后台服务器的静态目录有可供下载的静态资源,后台人员告知你文件路径,直接window.location.href方式获取即可;
  • 如果后台服务器无可供下载的静态资源,返回的是一个文件流(response-type: application/octet-stream;charset=UTF-8 ),则使用第二种方式(将文件写入内存,并且创建a元素,a链接href属性指向内存中的文件,download属性指向要下载的文件名,模拟a元素的点击事件,进行下载;)

1、 第一种,后台服务器有静态资源且是固定的文件名(GET方式下载文件)

window.location.href="http://www.域名/template.xlsx(文件名)"

2、第二种,后台返回文件流

解决办法一:本地可测试;推荐使用;

第一步:引入axios第三方库

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

第二步:传参、调接口,下载文件

返回数据是Blob对象

axios.post(请求路径URL, {参数Params}, {responseType: 'blob'}).then(function(res){var blob = res.data;// FileReader主要用于将文件内容读入内存var reader = new FileReader();reader.readAsDataURL(blob);// onload当读取操作成功完成时调用reader.onload = function(e) {var a = document.createElement('a');// 获取文件名fileNamevar fileName = res.headers["content-disposition"].split("=");fileName = fileName[fileName.length - 1];fileName = fileName.replace(/"/g, "");a.download = fileName;a.href = e.target.result;document.body.appendChild(a);a.click();document.body.removeChild(a);}});

返回的数据是流文件:(流文件和Blob是不同的)

考虑到兼容IE等问题 最好采用下列的方式:

let res = await proudctionApi.export_zjy(data);//获取数据
let blob = this.getBlob(res.data);// 将数据转化为Blob对象
let fileName = `日报${this.date}.xlsx`;// 设置文件名utils.saveAs(blob, fileName); //getBlob方法
getBlob(data) {let blob = new Blob([data], {type: "application/vnd.ms-excel;charset=utf-8",});return blob;}
//proudctionApi.export_zjy
export function export_zjy(data) {return request({url: "/wellbore/com_daily/export_zjy",method: "post",data,responseType: 'blob' //必须设置返回数据类型 为blob});
}//utils.save 方法如下:
export const saveAs = (blob, filename) => {if (window.navigator.msSaveOrOpenBlob) {//IE保存Blob对象navigator.msSaveBlob(blob, filename)} else {//其他浏览器var link = document.createElement('a')var body = document.querySelector('body')/*window.URL.createObjectURL可以用于在浏览器上预览本地图片或者视频,创建一个url*/link.href = window.URL.createObjectURL(blob)//为Blob对象创建一个url地址link.download = filename/*
如果不设置download属性的话,呢么如果是jpg、txt等浏览器支持打开的属性,就会在浏览器打开该文件而不是下载下来
*/// fix Firefoxlink.style.display = 'none'body.appendChild(link)link.click()body.removeChild(link)window.URL.revokeObjectURL(link.href)// 释放地址}}

解决办法二:form表单提交,本地不可测试;不推荐使用;

var exportForm = $('<form action="/api/cert/download" method="post">\<input type="hidden" name="ids" value="'+参数ids值+'"/>\</form>');$(document.body).append(exportForm);exportForm.submit();exportForm.remove();

参考地址:

https://www.cnblogs.com/zero-zm/p/12366955.html

JS 下载文件两种方式总结相关推荐

  1. STM32_基础入门_程序下载的两种方式

    一.ISP串口下载 1.所涉及工具:MDK+FlyMcu 2.硬件连接 3.连接步骤 1.搜索并选择对应串口 2.选择要下载的hex文件,将"编程前重装文件"打勾 3.勾选&quo ...

  2. python-网络图片下载(两种方式)

    利用python进行网络图片下载(两种方式) 1:方式一 1:代码 # coding=utf-8 """ @author: jiajiknag 程序功能: 图片批量下载_ ...

  3. iOS WKWebView和JS交互的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 本文介绍两种方式实现iOS WKWebView和JS交互 WKWebViewConfiguration注入WKScriptMe ...

  4. javascript下载文件几种方式,接收后台返回流下载或直接下载文件

    目录 1 javascript下载文件7中方式 1.1 window.location.href下载 1.2 window.location下载 1.3 iframe下载 1.4 form表单的形式下 ...

  5. 下载网络图片两种方式

    比如因特网上有一图片资源http://img.7799520.com/00356c0e-1725-4dc2-b091-5db958b6c637,现在要把该资源下载到本地,下面介绍如下两种方式. 方式一 ...

  6. Linux之文件上传和下载(两种方式)

    一.rz上传.sz下载文件 rz是将Windows系统上的文件上传到Linux下sz是将Linux系统下的文件上传到Windows下 1.rz案例,输入rz下载文件到Linux下 [root@bogo ...

  7. 前端实现HTML转PDF下载的两种方式

    方式一:使用html2canvas和jspdf插件实现 该方式是通过html2canvas将HTML页面转换成图片,然后再通过jspdf将图片的base64生成为pdf文件.实现步骤如下: 1,下载插 ...

  8. 以太坊智能合约交互调用,web3.js,web3j两种方式实现

    导语 接上篇文章 <使用hardhat部署solidity智能合约到测试网> 部署完合约之后,那么如何区块链进行交互呢?这节的主要内容就是使用web3.js和web3j来与区块链以及链上的 ...

  9. .net 下载文件几种方式

    方式一:TransmitFile实现下载.将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件. protected void Button1_Click(object sender, ...

最新文章

  1. .dat文件写入byte类型数组_深入浅出MATLAB数据处理之文件读写
  2. linux inotifywait脚本,使用inotify/fswatch构建自动监控脚本
  3. “红色军团”崛起Gartner x86服务器虚拟化魔力象限
  4. 检测到目标url存在框架注入漏洞_HOST注入攻击剖析
  5. 85元一个万能工具箱,配齐24种螺丝刀+扳手,媲美德国工艺,家庭必备
  6. bzoj5108 数据_成都day3t3
  7. python中字典的value可以为任意对象_Python学习之字典的删改查操作
  8. JS 调试(debug)
  9. Python学习入门9:如何高效学Python?
  10. Druid 简介,架构,部署,python连接,hue链接druid
  11. 网页设计与制作项目教程HTML+CSS+JavaScript之项目二
  12. 2008年上半年程序员考试上午真题自我汇总
  13. vc程序大小优化最佳方案(转)http://blog.sina.com.cn/s/blog_4c50333c0100gjs3.html
  14. Miracle2.1 列表页面显示附件链接
  15. c语言gets和puts的区别,C 语言 gets()和puts()
  16. html5移动开发是什么意思,移动端什么意思?
  17. 剑与家园服务器维护,剑与家园合服爆料 合服规则介绍
  18. android安装sdk时,failed read或者write可能是权限问题
  19. Dz经典加密解密方法。
  20. SDUWH2019-2020寒假python实训--Chp2

热门文章

  1. Air724开发板GPIO试验
  2. Ubuntu 安装和配置Eclipse
  3. c#+sql语言开发的小区物业管理系统,基于C#环境下的物业管理系统.doc
  4. 前端获取视频流并播放
  5. xendesktop更新计算机,XenDesktop7.12发布Win10周年更新版桌面
  6. 无刷直流电机--参考博客
  7. HJ26 字符串排序
  8. ESP8266_02程序的编译与下载
  9. 【证明】线性变换在两个基下的矩阵相似
  10. 咋由123变为11233c语言,大连理工自动控制原理习题答案