From 68af47f24bc344d2e1c5e1a848458b38679ddad4 Mon Sep 17 00:00:00 2001 From: fei <791364011@qq.com> Date: 星期一, 06 十月 2025 08:39:51 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java | 388 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 331 insertions(+), 57 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index b68b6f5..8e2e52c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -1,15 +1,30 @@ package com.ruoyi.web.controller.common; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.websocket.server.PathParam; +import com.ruoyi.common.annotation.Anonymous; +import com.ruoyi.common.utils.RenamedMultipartFile; +import com.ruoyi.common.utils.uuid.UUID; import com.ruoyi.service.DownLoadFileService; +import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -28,8 +43,7 @@ */ @RestController @RequestMapping("/common") -public class CommonController -{ +public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); @Autowired @@ -40,41 +54,70 @@ private static final String FILE_DELIMETER = ","; - /** - * 閫氱敤涓嬭浇璇锋眰 - * - * @param fileName 鏂囦欢鍚嶇О - * @param delete 鏄惁鍒犻櫎 - */ - @GetMapping("/download") - public void fileDownload(@PathParam("fileName") String fileName, @PathParam("delete") Boolean delete, HttpServletResponse response, HttpServletRequest request) - { - try - { - if (!FileUtils.checkAllowDownload(fileName)) - { - throw new Exception(StringUtils.format("鏂囦欢鍚嶇О({})闈炴硶锛屼笉鍏佽涓嬭浇銆� ", fileName)); - } - String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); - String filePath = RuoYiConfig.getDownloadPath() + fileName; + private static final Pattern CHINESE_PATTERN = Pattern.compile("[\u4e00-\u9fa5]"); - response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); - FileUtils.setAttachmentResponseHeader(response, realFileName); - FileUtils.writeBytes(filePath, response.getOutputStream()); - if (delete) - { - FileUtils.deleteFile(filePath); - } - } - catch (Exception e) - { - log.error("涓嬭浇鏂囦欢澶辫触", e); - } - } + +// @GetMapping("/downloadFile") +// public void fileDownload(@PathParam("path") String path, HttpServletResponse response) +// { +// path=path.substring(8); +// try +// { +// if (!FileUtils.checkAllowDownload(path)) +// { +// throw new Exception(StringUtils.format("鏂囦欢鍚嶇О({})闈炴硶锛屼笉鍏佽涓嬭浇銆� ", path)); +// } +// String realFileName = System.currentTimeMillis() + path.substring(path.indexOf("_") + 1); +// String filePath = RuoYiConfig.getProfile() + path; +// +// response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); +// FileUtils.setAttachmentResponseHeader(response, realFileName); +// FileUtils.writeBytes(filePath, response.getOutputStream()); +// +// } +// catch (Exception e) +// { +// log.error("涓嬭浇鏂囦欢澶辫触", e); +// } +// } + + + // /** +// * 閫氱敤涓嬭浇璇锋眰 +// * +// * @param fileName 鏂囦欢鍚嶇О +// * @param delete 鏄惁鍒犻櫎 +// */ +// @GetMapping("/download") +// public void fileDownload(@PathParam("fileName") String fileName, @PathParam("delete") Boolean delete, HttpServletResponse response) +// { +// try +// { +// if (!FileUtils.checkAllowDownload(fileName)) +// { +// throw new Exception(StringUtils.format("鏂囦欢鍚嶇О({})闈炴硶锛屼笉鍏佽涓嬭浇銆� ", fileName)); +// } +// String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); +// String filePath = RuoYiConfig.getDownloadPath() + fileName; +// +// response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); +// FileUtils.setAttachmentResponseHeader(response, realFileName); +// FileUtils.writeBytes(filePath, response.getOutputStream()); +// if (delete) +// { +// FileUtils.deleteFile(filePath); +// } +// } +// catch (Exception e) +// { +// log.error("涓嬭浇鏂囦欢澶辫触", e); +// } +// } + @Anonymous @GetMapping("/downLoadFile") public void downLoadFile(@PathParam("path") String path, HttpServletResponse response) throws Exception { - downLoadFileService.downLoadFile(path,response); + downLoadFileService.downLoadFile(path, response); } @@ -82,35 +125,38 @@ * 閫氱敤涓婁紶璇锋眰锛堝崟涓級 */ @PostMapping("/upload") - public AjaxResult uploadFile(@RequestParam("uploadFile") MultipartFile file) throws Exception - { - try - { + public AjaxResult uploadFile(@RequestParam("uploadFile") MultipartFile file, String fname) throws Exception { + try { // 涓婁紶鏂囦欢璺緞 String filePath = RuoYiConfig.getUploadPath(); // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О - String fileName = FileUploadUtils.upload(filePath, file); + String fileName = FileUploadUtils.upload(filePath, file, fname); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); - ajax.put("url", url); - ajax.put("fileName", fileName); - ajax.put("newFileName", FileUtils.getName(fileName)); - ajax.put("originalFilename", file.getOriginalFilename()); + + HashMap<String, Object> data = new HashMap<>(); + data.put("url", url); + data.put("fileName", fileName); + data.put("newFileName", FileUtils.getName(fileName)); + data.put("originalFilename", file.getOriginalFilename()); + + ajax.put("msg", "鎿嶄綔鎴愬姛"); + ajax.put("data", data); return ajax; - } - catch (Exception e) - { + } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } + /** * 閫氱敤涓婁紶璇锋眰锛堝涓級 */ @PostMapping("/uploads") - public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception + public AjaxResult uploadFiles(@RequestParam("files") List<MultipartFile> files) throws Exception { + //System.out.println("99999999999999999999999990000000000000000"); try { // 涓婁紶鏂囦欢璺緞 @@ -119,10 +165,17 @@ List<String> fileNames = new ArrayList<String>(); List<String> newFileNames = new ArrayList<String>(); List<String> originalFilenames = new ArrayList<String>(); + // System.out.println("99999999999999999999999990000000000000000"); + // System.out.println(files); + // System.out.println(files.size()); + for (MultipartFile file : files) { // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О - String fileName = FileUploadUtils.upload(filePath, file); + String filename = ""; + // System.out.println("1122123330+++++++++++++++++++++++++++++"); + + String fileName = FileUploadUtils.upload(filePath, file, filename); String url = serverConfig.getUrl() + fileName; urls.add(url); fileNames.add(fileName); @@ -130,10 +183,13 @@ originalFilenames.add(file.getOriginalFilename()); } AjaxResult ajax = AjaxResult.success(); + // System.out.println("99999999999999999999999990000000000000000"); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + // System.out.println("1122123330+++++++++++++++++++++++++++++"); return ajax; } catch (Exception e) @@ -143,16 +199,235 @@ } /** + * 閫氱敤涓婁紶璇锋眰锛堝涓級 灏嗕腑鏂囦慨鏀逛负鍏朵粬 + */ + @PostMapping("/noChinese/uploads") + public AjaxResult noChineseUploadFiles(@RequestParam("files") List<MultipartFile> files) throws Exception { + //System.out.println("99999999999999999999999990000000000000000"); + try { + // 涓婁紶鏂囦欢璺緞 + String filePath = RuoYiConfig.getUploadPath(); + List<String> urls = new ArrayList<String>(); + List<String> fileNames = new ArrayList<String>(); + List<String> newFileNames = new ArrayList<String>(); + List<String> originalFilenames = new ArrayList<String>(); + + for (MultipartFile file : files) { + originalFilenames.add(file.getOriginalFilename()); + + String safeFilename = generateSafeFilename(file.getOriginalFilename()); + + MultipartFile renamedFile = new RenamedMultipartFile(file, safeFilename); + + String lastName=""; + + String fileName = FileUploadUtils.upload(filePath, renamedFile, lastName); + + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + } + AjaxResult ajax = AjaxResult.success(); + + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 鐢熸垚瀹夊叏鏂囦欢鍚嶏紙鍙浛鎹腑鏂囬儴鍒嗭級 + */ + private String generateSafeFilename(String originalName) { + if (originalName == null) { + return ""; + } + + // 1. 鑾峰彇鏂囦欢鎵╁睍鍚� + String extension = ""; + int dotIndex = originalName.lastIndexOf('.'); + if (dotIndex > 0) { + extension = originalName.substring(dotIndex); + originalName = originalName.substring(0, dotIndex); + } + + // 2. 鍙浛鎹腑鏂囬儴鍒� + StringBuilder safeName = new StringBuilder(); + Matcher matcher = CHINESE_PATTERN.matcher(originalName); + int lastEnd = 0; + + while (matcher.find()) { + // 娣诲姞闈炰腑鏂囬儴鍒� + safeName.append(originalName, lastEnd, matcher.start()); + + // 娣诲姞闅忔満瀛楃涓叉浛鎹腑鏂� + safeName.append(generateRandomString(4)); + + lastEnd = matcher.end(); + } + + // 娣诲姞鍓╀綑閮ㄥ垎 + safeName.append(originalName.substring(lastEnd)); + String noSpaceName = safeName.toString().replaceAll("\\s", ""); + + // 3. 娣诲姞鎵╁睍鍚� + return noSpaceName + extension; + } + /** + * 鐢熸垚闅忔満瀛楃涓诧紙瀛楁瘝+鏁板瓧锛� + */ + private String generateRandomString(int length) { + String uuid = UUID.randomUUID().toString().replace("-", ""); + return uuid.substring(0, Math.min(length, uuid.length())); + } + + + @PostMapping("/uploads1") + public AjaxResult uploadFiles1(@RequestParam("files") List<MultipartFile> files) { + try { + String filePath = RuoYiConfig.getUploadPath(); + List<String> urls = new ArrayList<>(); + List<String> fileNames = new ArrayList<>(); + List<String> newFileNames = new ArrayList<>(); + List<String> originalFilenames = new ArrayList<>(); + List<String> httpSafePaths = new ArrayList<>(); + + for (MultipartFile file : files) { + // 1. 涓婁紶鏂囦欢 + String fileName = FileUploadUtils.upload(filePath, file, ""); + String originalFilename = file.getOriginalFilename(); + + // 2. 鑾峰彇HTTP瀹夊叏璺緞 + String httpSafePath = toHttpPath(fileName); + + // 3. 鏋勫缓瀹屾暣URL锛堢‘淇濇湁鏂滄潬鍒嗛殧锛� + String baseUrl = serverConfig.getUrl(); + if (!baseUrl.endsWith("/") && !httpSafePath.startsWith("/")) { + baseUrl += "/"; + } + String url = baseUrl + httpSafePath; + + urls.add(url); + fileNames.add(fileName); + newFileNames.add(FileUtils.getName(fileName)); + originalFilenames.add(originalFilename); + httpSafePaths.add(httpSafePath); + } + + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + ajax.put("httpSafePaths", StringUtils.join(httpSafePaths, FILE_DELIMETER)); + return ajax; + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + + /** + * 灏嗗寘鍚腑鏂囩殑鏂囦欢璺緞杞崲涓� HTTP 瀹夊叏鐨� URL 璺緞 + */ + + public String toHttpPath(String filePath) { + try { + // 1. 鏍囧噯鍖栬矾寰� + Path normalizedPath = Paths.get(filePath).normalize(); + + // 2. 缁熶竴浣跨敤姝f枩鏉� + String pathStr = normalizedPath.toString().replace("\\", "/"); + + // 3. 鍒嗗壊璺緞缁勪欢 + String[] parts = pathStr.split("/"); + StringBuilder encodedPath = new StringBuilder(); + + // 4. 瀵规瘡涓粍浠跺崟鐙紪鐮佸苟澶勭悊绌烘牸 + for (String part : parts) { + if (!part.isEmpty()) { + // 缂栫爜骞舵浛鎹㈢┖鏍间负 %20 + String encodedPart = URLEncoder.encode(part, StandardCharsets.UTF_8.name()) + .replace("+", "%20"); + encodedPath.append("/").append(encodedPart); + } + } + + // 5. 澶勭悊缁濆璺緞鍜岀浉瀵硅矾寰� + return filePath.startsWith("/") || filePath.startsWith("\\") ? + encodedPath.toString() : + encodedPath.substring(1); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("UTF-8 encoding not supported", e); + } + } + + /** + * 浠� HTTP URL 璺緞杩樺師鍘熷涓枃璺緞 + */ + @PostMapping("/getFileName") + public String extractFileName(@RequestBody String httpPath) { + try { + // 1. 澶勭悊绌哄�� + if (httpPath == null || httpPath.trim().isEmpty()) { + return ""; + } + + // 2. 绉婚櫎URL鍗忚銆佸煙鍚嶅拰鏌ヨ鍙傛暟 + String pathOnly = httpPath; + + // 绉婚櫎鍗忚鍜屽煙鍚� + if (pathOnly.contains("://")) { + pathOnly = pathOnly.substring(pathOnly.indexOf("://") + 3); + pathOnly = pathOnly.substring(pathOnly.indexOf('/')); + } + + // 绉婚櫎鏌ヨ鍙傛暟锛堝 ?token=123锛� + int queryStart = pathOnly.indexOf('?'); + if (queryStart > 0) { + pathOnly = pathOnly.substring(0, queryStart); + } + + // 3. URL瑙g爜 + String decodedPath = URLDecoder.decode(pathOnly, StandardCharsets.UTF_8.name()); + + // 4. 鎻愬彇鏂囦欢鍚嶏紙澶勭悊Windows璺緞锛� + decodedPath = decodedPath.replace("\\", "/"); + + // 鑾峰彇鏈�鍚庝竴涓潪绌鸿矾寰勭粍浠� + int lastSlash = decodedPath.lastIndexOf('/'); + String fileName = (lastSlash >= 0 && lastSlash < decodedPath.length() - 1) ? + decodedPath.substring(lastSlash + 1) : decodedPath; + + // 5. 澶勭悊鐗规畩鎯呭喌锛堝缁撳熬鏂滄潬锛� + if (fileName.isEmpty()) { + // 灏濊瘯鑾峰彇鍊掓暟绗簩涓粍浠� + int prevSlash = decodedPath.lastIndexOf('/', lastSlash - 1); + if (prevSlash >= 0) { + fileName = decodedPath.substring(prevSlash + 1, lastSlash); + } + } + + return fileName; + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("UTF-8 encoding not supported", e); + } + } + + + /** * 鏈湴璧勬簮閫氱敤涓嬭浇 */ @GetMapping("/download/resource") public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) - throws Exception - { - try - { - if (!FileUtils.checkAllowDownload(resource)) - { + throws Exception { + try { + if (!FileUtils.checkAllowDownload(resource)) { throw new Exception(StringUtils.format("璧勬簮鏂囦欢({})闈炴硶锛屼笉鍏佽涓嬭浇銆� ", resource)); } // 鏈湴璧勬簮璺緞 @@ -164,10 +439,9 @@ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.setAttachmentResponseHeader(response, downloadName); FileUtils.writeBytes(downloadPath, response.getOutputStream()); - } - catch (Exception e) - { + } catch (Exception e) { log.error("涓嬭浇鏂囦欢澶辫触", e); } + } -} +} \ No newline at end of file -- Gitblit v1.9.1