附件下载跨域问题-解决

1.若依附件下载跨域

源码:

package com.ruoyi.common.utils.file;import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.utils.StringUtils;/*** 文件处理工具类* * @author ruoyi*/
public class FileUtils extends org.apache.commons.io.FileUtils
{public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";/*** 输出指定文件的byte数组* * @param filePath 文件路径* @param os 输出流* @return*/public static void writeBytes(String filePath, OutputStream os) throws IOException{FileInputStream fis = null;try{File file = new File(filePath);if (!file.exists()){throw new FileNotFoundException(filePath);}fis = new FileInputStream(file);byte[] b = new byte[1024];int length;while ((length = fis.read(b)) > 0){os.write(b, 0, length);}}catch (IOException e){throw e;}finally{if (os != null){try{os.close();}catch (IOException e1){e1.printStackTrace();}}if (fis != null){try{fis.close();}catch (IOException e1){e1.printStackTrace();}}}}/*** 删除文件* * @param filePath 文件* @return*/public static boolean deleteFile(String filePath){boolean flag = false;File file = new File(filePath);// 路径为文件且不为空则进行删除if (file.isFile() && file.exists()){file.delete();flag = true;}return flag;}/*** 文件名称验证* * @param filename 文件名称* @return true 正常 false 非法*/public static boolean isValidFilename(String filename){return filename.matches(FILENAME_PATTERN);}/*** 检查文件是否可下载* * @param resource 需要下载的文件* @return true 正常 false 非法*/public static boolean checkAllowDownload(String resource){// 禁止目录上跳级别if (StringUtils.contains(resource, "..")){return false;}// 检查允许下载的文件规则if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))){return true;}// 不在允许下载的文件规则return false;}/*** 下载文件名重新编码* * @param request 请求对象* @param fileName 文件名* @return 编码后的文件名*/public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException{final String agent = request.getHeader("USER-AGENT");String filename = fileName;if (agent.contains("MSIE")){// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");}else if (agent.contains("Firefox")){// 火狐浏览器filename = new String(fileName.getBytes(), "ISO8859-1");}else if (agent.contains("Chrome")){// google浏览器filename = URLEncoder.encode(filename, "utf-8");}else{// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}/*** 流文件下载** @param filePath* @param response*/public static void streamDownload(String filePath, HttpServletResponse response, String ctName, String ctFileType) {try {File file = new File(filePath);InputStream is = new BufferedInputStream(new FileInputStream(file));byte[] buffer = new byte[is.available()];is.read(buffer);is.close();response.reset();response.addHeader("Content-Disposition","attachment;filename*=utf-8''" + URLEncoder.encode(ctName, "utf-8")/* + ctFileType*/);//            response.addHeader("Content-Disposition", "attachment;filename=" + new// String(file.getName().getBytes()));response.addHeader("Content-Length", "" + file.length());OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");toClient.write(buffer);toClient.flush();toClient.close();} catch (IOException e) {e.printStackTrace();}}/*** 下载文件名重新编码** @param response 响应对象* @param realFileName 真实文件名* @return*/public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException{String percentEncodedFileName = percentEncode(realFileName);StringBuilder contentDispositionValue = new StringBuilder();contentDispositionValue.append("attachment; filename=").append(percentEncodedFileName).append(";").append("filename*=").append("utf-8''").append(percentEncodedFileName);response.setHeader("Content-disposition", contentDispositionValue.toString());}/*** 百分号编码工具方法** @param s 需要百分号编码的字符串* @return 百分号编码后的字符串*/public static String percentEncode(String s) throws UnsupportedEncodingException{String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());return encode.replaceAll("\\+", "%20");}
}

1.1 问题原因

1.2 解决办法,替换掉 response 的值


// 设置输出的格式response.reset();response.setCharacterEncoding("UTF-8");response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);response.addHeader("Access-Control-Allow-Origin", "*");//后端允许跨域response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");

2.自定义附件下载代码

  @Overridepublic void downloadFile(String id, HttpServletResponse response, String funNo) {TbFile tbFile = tbFileService.selectTbFileByCtId(Long.valueOf(id));if (tbFile == null) {throw new CustomException("文件下载失败,文件不存在,请联系管理员处理!");}String url = tbFile.getUrl().substring(6, tbFile.getUrl().length());// 下载本地文件String fileName = url; // 文件的默认保存名// 读到流中InputStream inStream = null;// 文件的存放路径try {inStream = new FileInputStream(tbFile.getUrl());} catch (FileNotFoundException e) {e.printStackTrace();}// 设置输出的格式response.reset();response.setCharacterEncoding("UTF-8");response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);response.addHeader("Access-Control-Allow-Origin", "*");//后端允许跨域response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");// 将文件名转成utf8的字符串形式try {response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 循环取出流中的数据byte[] b = new byte[100];int len;try {while ((len = inStream.read(b)) > 0)response.getOutputStream().write(b, 0, len);inStream.close();} catch (IOException e) {e.printStackTrace();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真实场景 这周的任意一天,获取上周一到周日的时间范围-作者:【小可耐教你学影刀RPA】

用户场景 我想在这周的任意一天,获取上周一到周日的时间范围,应该怎么做 解决办法1 用指令解决 最简单 解决办法2 自己写逻辑 不过要用到 获取当前日期指令 当前是礼拜几

Hugging Face系列2:详细剖析Hugging Face网站资源——实战六类开源库

Hugging Face系列2:详细剖析Hugging Face网站资源——实战六类开源库 前言本篇摘要2. Hugging Face开源库2.1 transformers2.1.1 简介2.1.2 实战1. 文本分类2. 图像识别3. 在Pytorch和TensorFlow中使用pipeline 2.2 diffusers2.2.1 简介2.2.2 实战1. 管线2. 模型和调…

俄罗斯ozon平台计算器,ozon定价计算器

在数字化飞速发展的今天,电商平台已成为商家们展示产品、吸引顾客的重要窗口。而在俄罗斯这一广阔的市场中,Ozon平台以其独特的优势,成为了众多电商卖家的首选。然而,想要在Ozon平台上脱颖而出,除了优质的产品和服务外…

初识C++ · 反向迭代器简介

目录 前言 反向迭代器的实现 前言 继模拟实现了list和vector之后,我们对迭代器的印象也是加深了许多,但是我们实现的都是正向迭代器,还没有实现反向迭代器,那么为什么迟迟不实现呢?因为难吗?实际上还好。…

《精品生活》万方普刊投稿发表简介

《精品生活》杂志是由国家新闻出版总署批准,南方出版传媒股份有限公司主管,广东大沿海出版工贸有限公司主办,广东精品生活杂志社出版的综合性文化期刊。主要栏目:教学研究、艺术教育、文化广角、民族文化、理论前沿、综合论坛。 刊…

【2024】Kafka Streams纤细介绍与具体使用(1)

目录 介绍关键特性应用场景核心概念部署方式kafka streams的处理模式 具体使用1、准备工作2、添加依赖3、代码实现3、测试 介绍 Kafka Streams是构建在Apache Kafka之上的客户端库,用于构建高效、实时的流处理应用。它允许你以高吞吐量和低延迟的方式处理记录流&am…

Prompt 指南之零样本与少样本提示,超详细解析!

前言 我将在本文中为你带来另外 2 种提示技术,它们分别是: 零样本提示(Zero-shot Prompting)少样本提示(Few-shot Prompting) shot 即代表示例 这两种技术利用 LLM 的强大预训练知识,通过最小…

云端狂飙:Django项目部署与性能优化的极速之旅

Hello,我是阿佑,这次阿佑将手把手带你亲自踏上Django项目从单机到云端的全过程,以及如何通过Docker实现项目的无缝迁移和扩展。不仅详细介绍了Docker的基本概念和操作,还深入探讨Docker Compose、Swarm和Kubernetes等高级工具的使…

1Panel 搭建 halo博客

线上服务器一直闲置,刷到视频 1Panel 能更好管理服务器,还能快速搭建博客,便上手试试,的确很方便,顺手记录一下。 零、准备工作 一台服务器(按需购买,此处准备的阿里云服务器一台,也…

postman教程-14-生成随机数

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了Postman关联接口的调用方法,本小节我们讲解一下Postman生成随机数的方法。 在接口测试中,经常需要向接口发送不同的输入数据,以确保接口的健壮性和可靠性。…

中国自动气象站:现代气象观测的中流砥柱

引言 气象观测是人类认识和预报天气的重要手段。在现代科技的推动下,自动气象站成为气象观测的重要工具,为天气预报、防灾减灾和气候研究提供了宝贵的数据支持。本文将介绍中国自动气象站的发展历程、技术特点及其在气象观测中的重要作用。 中国自动气象…

关于远程销售的电子课程开发

一家国际网络安全公司委托我们开发用于培训销售代表远程和电话销售的互动电子内容。我们在 Articulate Storyline 中创建了情节脚本和二维动画,以解释关键概念和销售技巧。互动元素使学习者可以按照自己的节奏进行学习,而我们的动画插图则使材料生动起来…

【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!

成都信息工程大学(Chengdu University of Information Technology),简称“成信大”,由中国气象局和四川省人民政府共建,入选中国首批“卓越工程师教育培养计划”、“2011计划”、“中西部高校基础能力建设工程”、四川…

运维系列.Linux下的用户管理

运维系列 Linux下的用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

LabVIEW FPGA开发NI sbRIO-9607高精度数字滤波器

使用NI sbRIO-9607硬件平台,通过LabVIEW FPGA模块实现一个高精度数字滤波器。该应用不需要额外的实时操作系统 (RT),所有控制与数据处理均在sbRIO-9607的FPGA上完成,充分利用其并行处理能力,实现低延迟、高性能的数据滤波。这种滤…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里,我们已经介绍了 Navicat 版本 17,现在我们来把注意力转移到另外两个值得关注的产品上,即 Navicat Data Modeler 和 Navicat BI(之前称为 Navicat Chart Creator)。今天的博客将介绍 Navicat Data Model…

AI Agent:人类工作范式的颠覆者还是人机协作新范式?

编者按: 当前大热的大语言模型和检索增强生成模型,虽然在语言理解和内容生成方面取得了突破性的进展,但仍然存在诸多限制。它们缺乏根据目标导引行为、持续学习和与环境交互的能力,难以应对复杂多变的现实场景需求。 今天为大家带…

代理IP科普:IP黑名单与IP白名单的机制与作用

在IP代理使用中,我们经常听到黑名单与白名单两个名词,它们不仅提供了强大的防御机制,还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

事务管理AOP

通过事务操作 删除部门的时候,同时删除员工,那么如果其中有异常,那么就进行事务回滚 使用注解Trance Transactional-propagation(传播行为)

基于协同过滤算法的东北特产销售系统的设计

基于协同过滤算法的东北特产销售系统的设计 管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,公告管理,新闻信息管理,商品管理 农户账户功能包括:系统首页&#xf…