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

写文件回前端进行下载,报错:原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)

后端写文件返回前端,出现该错误。

解决

设置允许跨域

response.setHeader("Access-Control-Allow-Origin", "*");

代码

后端

public void exportTemplate(HttpServletResponse response) {
ArrayList<ActiveGifts> activeGifts = new ArrayList<>();
String fileName = DateUtil.format(new Date(), "yyyyMMddHHmmss") + "模板文件.xlsx";

// 对文件名进行URI编码
try {
// 清空response
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), "ISO8859-1") + ";filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
//允许跨域
response.setHeader("Access-Control-Allow-Origin", "*");
// 用 EasyExcel 写入响应输出流
EasyExcel.write(response.getOutputStream(), ActiveGifts.class).sheet("模板").doWrite(activeGifts);
} catch (IOException e) {
e.printStackTrace();
}
}

前端

activeGiftsApi.activeGiftsDownloadTemp().then((res) => {
   let blob = new Blob([res.data], {type: 'application/vnd.ms-excel;charset=utf-8'}) // 文件类型
   console.log(res.headers['content-disposition']); // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx") 设置的文件名;
   //以=分割取数组[1]元素为文件名
   let filename = '123123'
   let url = window.URL.createObjectURL(blob);  // 创建下载链接
   let aLink = document.createElement("a");    // 赋值给a标签的href属性
   aLink.style.display = "none";
   aLink.href = url;
   aLink.setAttribute("download", filename);
   document.body.appendChild(aLink);   // 将a标签挂载上去
   aLink.click();          // a标签click事件
   document.body.removeChild(aLink);  // 移除a标签
   window.URL.revokeObjectURL(url);   // 销毁下载链接
})

http://www.kler.cn/a/381747.html

相关文章:

  • 计算机网络:网络层 —— 移动 IP 技术
  • 若依项目搭建
  • Python常用脚本集锦
  • Rust常用数据结构教程 String与str,元组和数组
  • Flink的环境搭建及使用
  • D59【python 接口自动化学习】- python基础之异常
  • 青少年编程与数学 02-003 Go语言网络编程 10课题、HTTP/HTTPS协议
  • PDF全能免费转换 3.18 | 免费PDF工具集,多种转换和美化功能
  • 前后端理解、API接口
  • Caffeine 手动策略缓存 put() 方法源码解析
  • Java基础-组件及事件处理(上)
  • Qt 环境实现视频和音频播放
  • 【C++的vector、list、stack、queue用法简单介绍】
  • Oracle OCP认证考试考点详解082系列09
  • 使用Centos搭建Rocket.Chat教程
  • 融合智能化和信息化的技术的智慧地产开源了。
  • shodan(五)连接Mongodb数据库Jenkinsorg、net、查看waf命令
  • HTMLCSS:3D 旋转卡片的炫酷动画
  • 传统运维往哪个方向发展比较好?这几个运维岗位趁早转型!
  • Hive操作库、操作表及数据仓库的简单介绍
  • 《手写Spring渐进式源码实践》实践笔记(第十六章 三级缓存解决循环依赖)
  • 认识微服务,微服务的拆分,服务治理(nacos注册中心,远程调用)
  • 纵然千万数据流逝,唯独vector长存
  • 解析 MySQL 数据库容量统计、存储限制与优化技巧
  • 【汇编语言】[BX]和loop指令(一)—— 初识[BX]和loop指令
  • 论文阅读- --DeepI2P:通过深度分类进行图像到点云配准