From 525e2a55a87d6a0246e426f3a1370fc5cf14d891 Mon Sep 17 00:00:00 2001 From: sh Date: Wed, 24 Jun 2026 13:23:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=B4=E6=92=AD=E6=8E=A8?= =?UTF-8?q?=E6=B5=81=E5=B7=A5=E5=85=B7=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/CmsLiveSteamingController.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsLiveSteamingController.java diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsLiveSteamingController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsLiveSteamingController.java new file mode 100644 index 0000000..cb89d82 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsLiveSteamingController.java @@ -0,0 +1,75 @@ +package com.ruoyi.cms.controller.cms; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ruoyi.common.core.domain.AjaxResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +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.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +@RestController +@RequestMapping("/cms/liveSteam") +@Api(tags = "后台:直播") +public class CmsLiveSteamingController { + + @ApiOperation("下载推流工具") + @PreAuthorize("@ss.hasPermi('cms:liveSteam:downloadTools')") + @GetMapping("/downloadTools") + public void downloadTools(HttpServletRequest request, HttpServletResponse response)throws Exception { + ObjectMapper mapper = new ObjectMapper(); + String name = "app.zip"; + String pathFile = "/data/downloadmodel/" + name; + File url = new File(pathFile); + + try { + request.setCharacterEncoding("utf-8"); + } catch (UnsupportedEncodingException e1) { + e1.printStackTrace(); + } + + // 文件不存在直接返回JSON,不走二进制下载逻辑 + if (!url.exists()) { + try { + response.setContentType("application/json;charset=UTF-8"); + mapper.writeValue(response.getWriter(), AjaxResult.error("文件未找到:" + name)); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + + // 文件名编码 + String encodeName = URLEncoder.encode(name, StandardCharsets.UTF_8.name()); + response.reset(); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=" + encodeName); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "max-age=0"); + + // 大文件缓冲区4k + byte[] buffer = new byte[8192]; // 加大缓冲区,加快传输 + try (InputStream in = new FileInputStream(url)) { + OutputStream out = response.getOutputStream(); + int len; + try { + while ((len = in.read(buffer)) != -1) { + out.write(buffer, 0, len); + } + out.flush(); + } catch (IOException e) { + System.out.println("下载中断:客户端主动断开连接,文件:" + name); + return; + } + } catch (IOException e) { + System.out.println("文件读取异常:" + e.getMessage()); + } + } +}