前端下载二进制pdf文件页面空白以及解决从content-disposition获取文件名中文乱码问题

本文主要是介绍前端下载二进制pdf文件页面空白以及解决从content-disposition获取文件名中文乱码问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、下载文件页面内容空白

问题描述:通过封装下载文件的接口把文件下载下来之后发现页面内容是空白的 但是页数是对的

解决:网上搜索各种方案 发现有人建议使用原生的axios,不做封装处理

附原文链接:前端axios请求二进制数据流转换生成PDF文件空白问题(终极解决方案)大家可参考这个方案(另外:我不明白为什么封装了就不可以)

不封装的请求完整代码:

import axios from 'axios'
// 下载试卷downLoadPaper (row) {axios({method: 'GET',headers: { token: this.token },url: `question/downloadTestPaper`,params: { testPaperId: row.paperId },responseType: 'blob' // responseType类型为 blob (二进制流)}).then(res => {console.log(res.headers['content-disposition'])const fileNameCode = res.headers['content-disposition'].split('fileName=')[1]//对文件名乱码转义--【Node.js】使用iconv-lite解决中文乱码let iconv = require('iconv-lite');let fileName = iconv.decode(fileNameCode, 'gbk');const blob = new Blob([res.data], { type: 'application/pdf' });const url = window.URL.createObjectURL(blob);// 拿到返回数据后,将二进制数据生成一个文件url,用URL.createObjectURL生成url时需要传入Blob类型的参数。const $a = document.createElement('a');$a.style.display = 'none';$a.href = url;$a.setAttribute('download', fileName);$a.click();}).catch(err => {console.log(err)})},

 二、content-disposition里fileName如果是中文会产生乱码问题

如下

 解决方案在下载试卷的方法代码里贴上了

另外附 如果出现找不到headers中的’content-disposition’的话

 

问题描述
显示的是这里出错了,我仔细看了看以后自己的后端没有传递这个参数
但是回去检查了一遍,确实传递了呀
然后我又发现,在浏览器调试器 network中居然有这个属性,但是在响应拦截器中居然没有打印出来,邪门滴很呐!!

产生问题原因
跨域(CORS)请求中,被axios封装好的XMLHttpRequest对象中的方法getResponseHeader()默认只能获取6个基本的字段:Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma。因此,需要获取其他的属性,需要后端在响应的时候去在Access-Control-Expose-Headers中指定content-disposition属性。
所以这是一个后端的锅,是他没有配置,这个问题去找后端,让他在response中配置放行。

后端解决方案

controller层中的二进制流文件下载方法下配置放行属性:

response.setHeader("Access-Control-Expose-Headers", "content-disposition");

这篇关于前端下载二进制pdf文件页面空白以及解决从content-disposition获取文件名中文乱码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/428848

相关文章

Mysql8.0修改配置文件my.ini的坑及解决

《Mysql8.0修改配置文件my.ini的坑及解决》使用记事本直接编辑my.ini文件保存后,可能会导致MySQL无法启动,因为MySQL会以ANSI编码读取该文件,解决方法是使用Notepad++... 目录Myhttp://www.chinasem.cnsql8.0修改配置文件my.ini的坑出现的问题

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

MySQL8.0找不到my.ini如何解决

《MySQL8.0找不到my.ini如何解决》在配置MySQL主从复制时,发现找不到my.ini配置文件,通过检查路径和打开隐藏文件夹,最终在C:ProgramDataMySQLMySQLSer... 目录问题描述解决方法总结问题描述今天在配置mysql主从复制的时候发现,找不到my.ini这个配置文件。

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

Mybatis提示Tag name expected的问题及解决

《Mybatis提示Tagnameexpected的问题及解决》MyBatis是一个开源的Java持久层框架,用于将Java对象与数据库表进行映射,它提供了一种简单、灵活的方式来访问数据库,同时也... 目录概念说明MyBATis特点发现问题解决问题第一种方式第二种方式问题总结概念说明MyBatis(原名

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下