From 699001a9fd31b4fc78e76bcff86ed324dd052c0c Mon Sep 17 00:00:00 2001
From: feige <feige@qq.com>
Date: 星期三, 12 十一月 2025 17:00:47 +0800
Subject: [PATCH] 修改了一个bug
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java | 293 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 260 insertions(+), 33 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 adad316..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,14 +1,26 @@
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;
@@ -31,8 +43,7 @@
*/
@RestController
@RequestMapping("/common")
-public class CommonController
-{
+public class CommonController {
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@Autowired
@@ -42,6 +53,9 @@
private DownLoadFileService downLoadFileService;
private static final String FILE_DELIMETER = ",";
+
+ private static final Pattern CHINESE_PATTERN = Pattern.compile("[\u4e00-\u9fa5]");
+
// @GetMapping("/downloadFile")
// public void fileDownload(@PathParam("path") String path, HttpServletResponse response)
@@ -68,9 +82,7 @@
// }
-
-
-// /**
+ // /**
// * 閫氱敤涓嬭浇璇锋眰
// *
// * @param fileName 鏂囦欢鍚嶇О
@@ -101,11 +113,11 @@
// log.error("涓嬭浇鏂囦欢澶辫触", e);
// }
// }
-@Anonymous
+ @Anonymous
@GetMapping("/downLoadFile")
public void downLoadFile(@PathParam("path") String path, HttpServletResponse response) throws Exception {
- downLoadFileService.downLoadFile(path,response);
+ downLoadFileService.downLoadFile(path, response);
}
@@ -113,14 +125,12 @@
* 閫氱敤涓婁紶璇锋眰锛堝崟涓級
*/
@PostMapping("/upload")
- public AjaxResult uploadFile(@RequestParam("uploadFile") MultipartFile file,String fname) 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,fname);
+ String fileName = FileUploadUtils.upload(filePath, file, fname);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
@@ -131,15 +141,14 @@
data.put("newFileName", FileUtils.getName(fileName));
data.put("originalFilename", file.getOriginalFilename());
- ajax.put("msg","鎿嶄綔鎴愬姛");
- ajax.put("data",data);
+ ajax.put("msg", "鎿嶄綔鎴愬姛");
+ ajax.put("data", data);
return ajax;
- }
- catch (Exception e)
- {
+ } catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
+
/**
* 閫氱敤涓婁紶璇锋眰锛堝涓級
@@ -156,15 +165,15 @@
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());
+ // System.out.println("99999999999999999999999990000000000000000");
+ // System.out.println(files);
+ // System.out.println(files.size());
for (MultipartFile file : files)
{
// 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О
String filename = "";
- // System.out.println("1122123330+++++++++++++++++++++++++++++");
+ // System.out.println("1122123330+++++++++++++++++++++++++++++");
String fileName = FileUploadUtils.upload(filePath, file, filename);
String url = serverConfig.getUrl() + fileName;
@@ -174,13 +183,13 @@
originalFilenames.add(file.getOriginalFilename());
}
AjaxResult ajax = AjaxResult.success();
- // System.out.println("99999999999999999999999990000000000000000");
+ // 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+++++++++++++++++++++++++++++");
+ // System.out.println("1122123330+++++++++++++++++++++++++++++");
return ajax;
}
catch (Exception e)
@@ -190,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));
}
// 鏈湴璧勬簮璺緞
@@ -211,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