From 4a59b1b0ee520c6bb1eb08815d41ef5a4bf54559 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Thu, 8 Jan 2026 13:30:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BDbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/Impl/EamObjectServiceImpl.java | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/xujie/sys/modules/pms/service/Impl/EamObjectServiceImpl.java b/src/main/java/com/xujie/sys/modules/pms/service/Impl/EamObjectServiceImpl.java index 977aaac8..00308351 100644 --- a/src/main/java/com/xujie/sys/modules/pms/service/Impl/EamObjectServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/pms/service/Impl/EamObjectServiceImpl.java @@ -26,6 +26,8 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; import java.net.URLConnection; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -264,39 +266,39 @@ public class EamObjectServiceImpl implements EamObjectService { } @Override - public void downLoadObjectFile(Integer id, HttpServletResponse response) throws UnsupportedEncodingException { - //处理路径和名称 + public void downLoadObjectFile(Integer id, HttpServletResponse response) { List getFileData = eamObjectMapper.getFileData(id); if (getFileData.isEmpty()) { throw new RuntimeException("该文件不存在,请刷新列表"); } - File file = new File(getFileData.get(0).getUrl()); - //读取缓存1kb - byte[] buffer = new byte[1024]; - FileInputStream fis = null; - BufferedInputStream bis = null; - //FileOutputStream fos = null; - //BufferedOutputStream bos = null; - response.setContentType("application/force-download;charset=utf-8"); - response.setHeader("Content-disposition", "attachment; filename=" + new String(getFileData.get(0).getFileName().getBytes("gbk"), "iso8859-1")); + File file = new File(getFileData.getFirst().getUrl()); + if (!file.exists()) { + throw new RuntimeException("文件不存在"); + } + // 核心:先 reset,清空所有可能的 header + response.reset(); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("UTF-8"); try { - //读取文件 - fis = new FileInputStream(file); - //加缓存 - bis = new BufferedInputStream(fis); - //开始读取 - int i = bis.read(buffer); - //设置输出流 - ServletOutputStream os = response.getOutputStream(); - //开始循环读取 - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); + String fileName = URLEncoder.encode(getFileData.getFirst().getFileName(), StandardCharsets.UTF_8).replaceAll("\\+", "%20"); + response.setHeader( + "Content-Disposition", + "attachment; filename*=UTF-8''" + fileName + ); + try ( + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); + ServletOutputStream os = response.getOutputStream() + ) { + byte[] buffer = new byte[8192]; + int len; + while ((len = bis.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + os.flush(); } - fis.close(); - //fos.close(); } catch (Exception e) { - throw new RuntimeException(e.getMessage()); + // 不能再写 response 了 + throw new RuntimeException("文件下载失败", e); } }