当前位置: 首页 > news >正文

axios文件下载使用后端传递的名称

java后端通过HttpServletResponse 返回文件流

在Content-Disposition中插入文件名
一定要设置Access-Control-Expose-Headers,代表跨域该Content-Disposition返回Header可读,如果没有,前端是取不到Content-Disposition的,可以在统一的配置里添加

response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("UTF-8");
// 跨域暴露Header属性Content-Disposition
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(byType.getName() , StandardCharsets.UTF_8) + ".xls");

在这里插入图片描述

vue前端通过 axios接收文件

老生常谈的 blob或者arraybuffer
这里以arraybuffer举例

export const exportExcel=(data: Object)=>{
	return request.get( option: {
		url:'/scrm/customer/exportExcel'
		data,
		responseType:'arraybuffer'
	})
})

找你的axios封装

vue2找 request.js
vue3找service.ts
或者你们自己封装的文件
找到里边的响应拦截器

request.interceptors.response.use
service.interceptors.response.use

在返回成功的前提下单独处理
直接返回response
如果你们封装的axios跟没封装一样可以忽略

if (response.request.responseType === 'blob' 
	|| response.request.responseType === 'arraybuffer') {
	return response
}

封装个统一的方法
TS

const download = {
object: ({data, headers}, fileName :string, contentType: string) => {
    try {
      const uri =headers["content-disposition"].split(";")[1].split("filename=")[1];
      fileName = decodeURIComponent(uri)
      contentType = headers["content-type"]
    } catch (e) {
      console.error(e)
    }
    // 老一套blob 
	const blob = new Blob([data],{ type: contentType})
    const link = document.createElement('a')
    const href = window.URL.createObjectURL(blob) // 创建下载的链接
    link.href = href
    link.download = fileName
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(href)
  }
}

JS

 downloadObject(res, fileName, contentType) {
 	let data = res.data
 	let headers = res.headers
 	try {
      const uri =headers["content-disposition"].split(";")[1].split("filename=")[1];
      fileName = decodeURIComponent(uri)
      contentType = headers["content-type"]
    } catch (e) {
      console.error(e)
    }
    // 老一套blob 
	const blob = new Blob([data],{ type: contentType})
    const link = document.createElement('a')
    const href = window.URL.createObjectURL(blob) // 创建下载的链接
    link.href = href
    link.download = fileName
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(href)
 }

调用

	exportExcel({//请求参数}).then(res => {
		// vue3
		download.object(res,'','')
		// vue2
		this.downloadObject(res)
	})

最后

需要注意的一共有两个点
第一 后端必须配置
response.setHeader(“Access-Control-Expose-Headers”, “Content-Disposition”);
第二 axios返回拦截器一定要返回完整的response,不能返回经过加工的response.data

相关文章:

  • PyQt6实例_批量下载pdf工具_exe使用方法
  • OSPF邻居状态机
  • MAC环境给docker换源
  • 硬件老化测试方案的设计误区
  • open-cv的安装
  • 蓝桥杯[每日一题] 真题:连连看
  • 12 - AXI4接口之DDR读写实验
  • 深入解析缓冲区:计算机世界的“蓄水池”与“加速器”
  • Linux环境下安装部署Docker
  • ArayTS:一个功能强大的 TypeScript 工具库
  • nginx安装
  • 几种常见的.NET单元测试模拟框架介绍
  • 外贸人如何应对Temu的冲击?
  • LabVIEW从需求快速开发的方法
  • IP协议的介绍
  • 2025跨境平台突围战:商家自营+精准供货+智能代销全渠道增长引擎
  • Qt正则表达式QRegularExpression
  • logstash收集数据
  • Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇
  • 测试用例与需求脱节的修复方案
  • 网站html优化/免费的外贸b2b网站
  • 湖州做网站的/代运营服务
  • 新型建筑模板设备/一站传媒seo优化
  • 昆明电子商务网站建设/百度竞价客服
  • jsp网站建设/百度高级检索入口
  • 快递公司网站怎么做/郑州百度seo关键词