网站首页 > 技术文章 正文
当我采用默认axios配置是不管我采用get还是post我都无法下载文件
我搓火的要死了;
后来将axios配置的responseType: 'blob' 文件好像是可以下载了,但是在ajax 返回中无法拿到 文件名称
文件名称 在返回的 的文件头 headers:content-disposition 中,但是我们的返回response 中就是没有这个参数
我在想是否后台没有设置这个文件头呢?
后台代码(PHP):
header('Content-Type:application/vnd.ms-excel');
header('Content-Disposition:attachment;filename="' . $filename . '"');
header('Cache-Control:max-age=0');
好像是设置了,Content-Disposition 协议头的,奇怪了
我查阅了HTTP协议文件说明,其实为了ajax安全性考虑,默认这个文件头 Content-Disposition 是不允许的 前端ajax直接获取的
于是代码改成(PHP)
header('Content-Type:application/vnd.ms-excel');
header('Content-Disposition:attachment;filename="' . $filename . '"');
header('Cache-Control:max-age=0');
header('Access-Control-Expose-Headers: Content-Disposition'); //这个是关键,允许ajax读取 Content-Disposition
可以下载了,这个是令人兴奋
这时前端的ajax终于可以拿到 Content-Disposition
前端代码如下
const _download = function (response) {
const attachment = response.headers['content-disposition']//关键
const fileName = attachment.match(/filename=(.*)/)[1];
const blob = new Blob([response.data], { type:response.headers['content-type'] })
if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(blob, decodeURI(fileName))
}else{
const blobURL = window.URL.createObjectURL(blob)
// 创建a标签,用于跳转至下载链接
const tempLink = document.createElement('a')
tempLink.style.display = 'none'
tempLink.href = blobURL
tempLink.setAttribute('download', decodeURI(fileName))
// 兼容:某些浏览器不支持HTML5的download属性
if (typeof tempLink.download === 'undefined') {
tempLink.setAttribute('target', '_blank')
}
// 挂载a标签
document.body.appendChild(tempLink)
tempLink.click()
document.body.removeChild(tempLink)
// 释放blob URL地址
window.URL.revokeObjectURL(blobURL)
}
}
但是新的问题来了,文件名称乱码
问题肯定是在后端,后台没有做文件名称转码处理;
后台代码修改
$filename = date('Y年m月d日H时', time()) . '.xlsx';
$filename = urlencode($filename);//处理中文乱码问题
$filename = str_replace("+", "%20", $filename); //处理兼容问题
header('Content-Type:application/octet-stream;charset=UTF-8');//处理中文乱码问题
header('Content-Disposition:attachment;filename="' . $filename . '"');
header('Cache-Control:max-age=0');
header('Access-Control-Expose-Headers: Content-Disposition');//这个是关键,允许ajax读取 Content-Disposition
好了到这里基本上都解决了,真的是这样吗?
我后台输出的文件名称是 ×××××.xlsx
但是我下载的文件竟然莫名其妙的被修改成了 ×××××_.xlsx_
我很郁闷了;目前我还没有找到何时的方法解决,
这个是由于浏览器安全问题导致,我试图想在nginx配置中加入欺骗手段处理浏览器安全,但是由于时间原因我先放下这个问题, 你可以试试看去解决;如果解决了请留言告诉我;
思考:
后台: 写代码是是否严格考虑了各种情况?
前端:是否考虑了多种下载方案;
究竟有哪些下载方案
1、前端直接将下载地址转到到一个虚拟的a标签,然后下载的内容的装配(new Blob) 交付给浏览器完成
缺点:无法采用POST方法了,只能用get方式了;
代码如下:
const _download = function (url,param) {
let _url =url+ '/?' +param//装配成get传递参数 // 创建a标签,用于跳转至下载链接
const tempLink = document.createElement('a')
tempLink.style.display = 'none'
tempLink.href = blobURL // 兼容:
if (typeof tempLink.download === 'undefined') {
tempLink.setAttribute('target', '_blank') } // 挂载a标签
document.body.appendChild(tempLink)
tempLink.click()//模拟点击下载
document.body.removeChild(tempLink) // 释放blob URL地址
window.URL.revokeObjectURL(blobURL)
}
2、ajax装配,就是本文档描述的方式;
猜你喜欢
- 2025-06-13 周均下载百万的TOP 12前端 Ponyfill !
- 2025-06-13 前端文件下载的N种姿势:从简单到高级
- 2024-10-03 JS 下载/导出 csv、excel、txt 、img等文件的方法总结
- 2024-10-03 入门 基础知识点:浏览器到底是如何下载资源的
- 2024-10-03 技术小白的微信小程序搭建之路(六:前端设置)
- 2024-10-03 springboot:实现文件上传下载实时进度条功能【附带源码】
- 2024-10-03 字节内部前端开发手册(完整版),开放下载
- 2024-10-03 前端 ajax 请求 Excel 文件下载的几种方式
- 2024-10-03 前端常见问题和技术解决方案 前端问题是什么意思
- 2024-10-03 springboot整合前端实现断点续传、大文件秒传以及多线程上传下载
你 发表评论:
欢迎- 554℃Oracle分析函数之Lag和Lead()使用
- 550℃几个Oracle空值处理函数 oracle处理null值的函数
- 543℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 537℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 535℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 524℃【数据统计分析】详解Oracle分组函数之CUBE
- 511℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 501℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端密码加密 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)