From 358dd949448f4e949bbf0d51cd3f7a3ed3c38f80 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Tue, 16 Dec 2025 14:03:35 +0800 Subject: [PATCH] =?UTF-8?q?2025-12-16=20CLODOP=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gaotao/config/ShiroConfig.java | 1 + .../controller/PrinterDownloadController.java | 119 ++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/main/java/com/gaotao/modules/print/controller/PrinterDownloadController.java diff --git a/src/main/java/com/gaotao/config/ShiroConfig.java b/src/main/java/com/gaotao/config/ShiroConfig.java index c6fd2f1..56c52db 100644 --- a/src/main/java/com/gaotao/config/ShiroConfig.java +++ b/src/main/java/com/gaotao/config/ShiroConfig.java @@ -62,6 +62,7 @@ public class ShiroConfig { filterMap.put("/pda/**", "anon"); filterMap.put("/favicon.ico", "anon"); filterMap.put("/bootstrap/**", "anon"); + filterMap.put("/printer/**", "anon"); // CLodop打印组件下载,无需登录 filterMap.put("/**", "oauth2"); filterMap.put("/by-file/**", "anon"); shiroFilter.setFilterChainDefinitionMap(filterMap); diff --git a/src/main/java/com/gaotao/modules/print/controller/PrinterDownloadController.java b/src/main/java/com/gaotao/modules/print/controller/PrinterDownloadController.java new file mode 100644 index 0000000..7a0ec84 --- /dev/null +++ b/src/main/java/com/gaotao/modules/print/controller/PrinterDownloadController.java @@ -0,0 +1,119 @@ +package com.gaotao.modules.print.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; + +/** + * CLodop打印组件下载控制器 + * 用于提供CLodop打印组件安装程序的下载功能 + */ +@RestController +@RequestMapping("/printer") +public class PrinterDownloadController { + + private static final Logger logger = LoggerFactory.getLogger(PrinterDownloadController.class); + + /** + * CLodop安装程序存放目录 + * 可在配置文件中配置,默认为 D:\MES_Application\Printer + */ + @Value("${clodop.installPath:D:\\MES_Application\\Printer}") + private String clodopInstallPath; + + /** + * CLodop安装程序文件名 + * 可在配置文件中配置,默认为 CLodop_Setup_for_Win32NT.exe + */ + @Value("${clodop.fileName:CLodop_Setup_for_Win64.exe}") + private String clodopFileName; + + /** + * 下载CLodop打印组件安装程序 + * 前端调用路径: /printer/download + * + * @param response HTTP响应对象 + */ + @GetMapping("/download") + public void downloadClodop(HttpServletResponse response) { + // 构建完整文件路径 + String filePath = clodopInstallPath + File.separator + clodopFileName; + File file = new File(filePath); + + // 检查文件是否存在 + if (!file.exists()) { + logger.error("CLodop安装程序文件不存在: {}", filePath); + try { + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write("
请联系管理员检查服务器上的文件路径: " + filePath + "
"); + } catch (IOException e) { + logger.error("写入错误响应失败", e); + } + return; + } + + // 检查文件是否可读 + if (!file.canRead()) { + logger.error("CLodop安装程序文件无法读取: {}", filePath); + try { + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write("请联系管理员检查文件权限
"); + } catch (IOException e) { + logger.error("写入错误响应失败", e); + } + return; + } + + logger.info("开始下载CLodop安装程序: {}", filePath); + + // 设置响应头 + try { + // 设置内容类型为二进制流,用于文件下载 + response.setContentType("application/octet-stream"); + // 设置文件大小 + response.setContentLengthLong(file.length()); + // 设置文件名,使用URL编码处理中文文件名 + String encodedFileName = URLEncoder.encode(clodopFileName, "UTF-8").replace("+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName); + // 允许跨域下载 + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + } catch (UnsupportedEncodingException e) { + logger.error("文件名编码失败", e); + } + + // 读取文件并写入响应流 + try (FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + OutputStream os = response.getOutputStream()) { + + byte[] buffer = new byte[8192]; // 8KB缓冲区 + int bytesRead; + while ((bytesRead = bis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.flush(); + logger.info("CLodop安装程序下载完成: {}", filePath); + + } catch (IOException e) { + logger.error("文件下载失败: {}", e.getMessage()); + // 如果还没有开始写入响应体,可以返回错误信息 + if (!response.isCommitted()) { + try { + response.reset(); + response.setContentType("text/html;charset=UTF-8"); + response.getWriter().write("" + e.getMessage() + "
"); + } catch (IOException ex) { + logger.error("写入错误响应失败", ex); + } + } + } + } +} +