From 1b40137cf9a73ee69c36a1e7c7bd85ed82ccc690 Mon Sep 17 00:00:00 2001 From: Kane Wang Date: Thu, 13 Nov 2025 15:48:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=A5=E5=8F=97=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E6=8E=A7=E5=88=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cpic/xim/utils/files/SaveUploadFile.java | 148 ++++++++++++++++++ .../files}/UploadedFile.java | 2 +- .../exceptions/MoveUploadedFileException.java | 26 +++ .../ProcessUploadedFileException.java | 10 +- .../controllers/fileupload/FileUpload.java | 87 ++-------- .../fileupload/FileUploadResult.java | 2 + .../fileupload/SaveUploadFile.java | 71 --------- 7 files changed, 193 insertions(+), 153 deletions(-) create mode 100644 code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/SaveUploadFile.java rename code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/{web/controllers/fileupload => utils/files}/UploadedFile.java (94%) create mode 100644 code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/MoveUploadedFileException.java rename code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/{web/controllers/fileupload => utils/files/exceptions}/ProcessUploadedFileException.java (57%) delete mode 100644 code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/SaveUploadFile.java diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/SaveUploadFile.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/SaveUploadFile.java new file mode 100644 index 0000000..bdf1f2f --- /dev/null +++ b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/SaveUploadFile.java @@ -0,0 +1,148 @@ +/** + * @Author: Kane Wang + * @Date: 2025-10-16 09:46:42 + * @LastEditors: Kane Wang + * @LastModified: 2025-11-13 15:25:07 + * @FilePath: src/main/java/com/cpic/xim/utils/files/SaveUploadFile.java + * @Description: + * + * Copyright (c) 2025 by Kane All rights reserved + */ +package com.cpic.xim.utils.files; + +import java.io.File; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.HashMap; +import java.util.Vector; + +import org.springframework.web.multipart.MultipartFile; + +import com.cpic.xim.utils.files.exceptions.MoveUploadedFileException; +import com.cpic.xim.utils.files.exceptions.ProcessUploadedFileException; + +public class SaveUploadFile +{ + /** + * + * @param files + * @param tempFilePath + * @return + * @throws ProcessUploadedFileException + */ + public static HashMap saveUploadFile( + MultipartFile[] files, + String tempFilePath + ) + throws ProcessUploadedFileException + { + HashMap savedFiles = new HashMap<>(); + // File dir = new File( tempFilePath ); + String fileName = ""; + String fullPath; + + if ( !(tempFilePath.endsWith( "/" ) || tempFilePath.endsWith( "\\" )) ) + { + fullPath = tempFilePath + "/"; + } + else + { + fullPath = tempFilePath; + } + + try + { + for ( MultipartFile file : files ) + { + // 空文件跳过 + if ( file.isEmpty() ) + { + continue; + } + + // 文件名前加上时间戳,避免覆盖 + Long milliSecond = LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli(); + + fileName = String.valueOf( milliSecond ) + " - " + file.getOriginalFilename(); + File destFile = new File( tempFilePath, fileName ); + + file.transferTo( destFile ); + + savedFiles.put( fileName, fullPath + fileName ); + } + } + catch ( IOException error ) + { + throw new ProcessUploadedFileException( "临时目录" + tempFilePath + "保存文件" + fileName + "失败!" ); + } + + return savedFiles; + } + + public static Vector saveUploadFiles( + MultipartFile[] files, + String tempFilePath + ) + throws ProcessUploadedFileException + { + Vector savedFiles = new Vector<>(); + UploadedFile uploadedFile = null; + // File dir = new File( tempFilePath ); + String fileName = ""; + String fullPath; + + if ( !(tempFilePath.endsWith( "/" ) || tempFilePath.endsWith( "\\" )) ) + { + fullPath = tempFilePath + "/"; + } + else + { + fullPath = tempFilePath; + } + + try + { + for ( MultipartFile file : files ) + { + // 空文件跳过 + if ( file.isEmpty() ) + { + continue; + } + + // 文件名前加上时间戳,避免覆盖 + Long milliSecond = LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli(); + + fileName = String.valueOf( milliSecond ) + " - " + file.getOriginalFilename(); + File destFile = new File( tempFilePath, fileName ); + + file.transferTo( destFile ); + + uploadedFile = new UploadedFile(fileName, fullPath); + + savedFiles.add( uploadedFile ); + } + } + catch ( IOException error ) + { + throw new ProcessUploadedFileException( "临时目录" + tempFilePath + "保存文件" + fileName + "失败!" ); + } + + return savedFiles; + } + + /** + * + * @param originFilePath 文件路径 + * @param newFilePath 新文件存放路径 + * @throws MoveUploadedFileException + */ + public static void MoveUploadedFile( + String originFilePath, + String newFilePath + ) throws MoveUploadedFileException + { + + } +} diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/UploadedFile.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/UploadedFile.java similarity index 94% rename from code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/UploadedFile.java rename to code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/UploadedFile.java index bda8a1e..f9f6132 100644 --- a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/UploadedFile.java +++ b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/UploadedFile.java @@ -8,7 +8,7 @@ * * Copyright (c) 2025 by Kane All rights reserved */ -package com.cpic.xim.web.controllers.fileupload; +package com.cpic.xim.utils.files; public class UploadedFile { diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/MoveUploadedFileException.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/MoveUploadedFileException.java new file mode 100644 index 0000000..aca44ed --- /dev/null +++ b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/MoveUploadedFileException.java @@ -0,0 +1,26 @@ +/** + * @Author: Kane Wang + * @Date: 2025-11-13 14:44:42 + * @LastEditors: Kane Wang + * @LastModified: 2025-11-13 14:45:56 + * @FilePath: src/main/java/com/cpic/xim/utils/files/exceptions/MoveUploadedFileException.java + * @Description: + * + * Copyright (c) 2025 by Kane All rights reserved + */ +package com.cpic.xim.utils.files.exceptions; + +import java.io.IOException; + +public class MoveUploadedFileException extends IOException +{ + public MoveUploadedFileException() + { + super("移动文件失败。"); + } + + public MoveUploadedFileException( String message ) + { + super( message ); + } +} diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/ProcessUploadedFileException.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/ProcessUploadedFileException.java similarity index 57% rename from code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/ProcessUploadedFileException.java rename to code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/ProcessUploadedFileException.java index 080ecfb..e8a7b92 100644 --- a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/ProcessUploadedFileException.java +++ b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/utils/files/exceptions/ProcessUploadedFileException.java @@ -2,24 +2,24 @@ * @Author: Kane Wang * @Date: 2025-10-15 12:06:26 * @LastEditors: Kane Wang - * @LastModified: 2025-10-16 09:59:39 - * @FilePath: src/main/java/com/cpic/xim/web/controllers/fileupload/ProcessUploadedFileException.java + * @LastModified: 2025-11-13 10:36:12 + * @FilePath: src/main/java/com/cpic/xim/utils/files/exceptions/ProcessUploadedFileException.java * @Description: * * Copyright (c) 2025 by Kane All rights reserved */ -package com.cpic.xim.web.controllers.fileupload; +package com.cpic.xim.utils.files.exceptions; import java.io.IOException; public class ProcessUploadedFileException extends IOException { - ProcessUploadedFileException() + public ProcessUploadedFileException() { super("上传文件失败!"); } - ProcessUploadedFileException( String message ) + public ProcessUploadedFileException( String message ) { super(message); } diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java index 643b7b4..8fcf37b 100644 --- a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java +++ b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java @@ -11,17 +11,20 @@ package com.cpic.xim.web.controllers.fileupload; import java.io.File; -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.util.Vector; -import jakarta.servlet.http.HttpServletRequest; + import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; +import com.cpic.xim.utils.files.SaveUploadFile; +import com.cpic.xim.utils.files.UploadedFile; +import com.cpic.xim.utils.files.exceptions.ProcessUploadedFileException; + +import jakarta.servlet.http.HttpServletRequest; + // @SuppressWarnings( "unused" ) @Controller @RequestMapping( path = "/file" ) @@ -34,80 +37,10 @@ public class FileUpload * 3、MultipartFile参数形参名称必须和请求form中file标签的name属性一致,否则值为null。 * 4、返回值为接收结果和文件保存绝对路径。 * - * @deprecated - * @param taskName 任务名称字符串 - * @param files MultipartFile结构的文件对象 - * @param request HttpServletRequest对象实例 - * @return 返回一个FileUploadResult对象,包含上传结果。 - */ - // @RequestMapping( path = "/file-upload.do" ) - // @ResponseBody - // public FileUploadResult getUploadFile( - // @RequestParam( "task-name" ) String taskName, - // @RequestParam( "files" ) MultipartFile file, - // HttpServletRequest request - // ) - // { - // // session id用来创建临时目录,避免重复 - // String sessionID = request.getSession().getId(); - // FileUploadResult result = new FileUploadResult(); - // Vector fileNames = new Vector(); - - // result.setSuccess( true ); - // result.setMessage( "上传成功!" ); - - // String filePath = request.getServletContext().getRealPath( "/temp/upload/" + sessionID ); - // File dir = new File( filePath ); - - // if ( !dir.mkdirs() ) - // { - - // } - - // // 检查文件长度,如果为0则跳过 - // if ( file.isEmpty() ) - // { - // result.setSuccess( false ); - // result.setMessage( "不允许上传空文件。" ); - // } - // else - // { - // // 保存文件到临时目录 - // Long milliSecond = LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli(); - // String fileName = String.valueOf( milliSecond ) + file.getOriginalFilename(); - // File destFile = new File( filePath, fileName ); - // // String fileName = file.getOriginalFilename(); - - // try - // { - // file.transferTo( destFile ); - // // 把上传文件的绝对路径保存,返回给前端 - // fileNames.add( destFile.getAbsolutePath() ); - - // result.setSuccess( true ); - // result.setMessage( "上传成功" ); - // result.setFileList( fileNames ); - // } - // catch ( IOException error ) - // { - // result.setSuccess( false ); - // result.setMessage( "上传失败,原因:" + error.getMessage() ); - // } - // } - - // return result; - // } - - /** - * 接收上传文件,并保存到临时目录: - * 1、临时目录下再用sessionID作为子目录保存文件。 - * 2、保存时不更改文件名,会覆盖同名文件。 - * 3、MultipartFile参数形参名称必须和请求form中file标签的name属性一致,否则值为null。 - * 4、返回值为接收结果和文件保存绝对路径。 * @param fileName * @param file * @param request - * @return + * @return FileUploadResult 文件上传结果对象 */ @RequestMapping( path = "/file-upload.do" ) @ResponseBody @@ -141,7 +74,9 @@ public class FileUpload { files[0] = file; - SaveUploadFile.saveUploadFile( files, filePath ); + Vector uploadFiles = SaveUploadFile.saveUploadFiles( files, filePath ); + + result.setFileList( uploadFiles ); } catch ( ProcessUploadedFileException error ) { diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUploadResult.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUploadResult.java index 84a918d..d17f681 100644 --- a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUploadResult.java +++ b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUploadResult.java @@ -17,6 +17,8 @@ package com.cpic.xim.web.controllers.fileupload; import java.util.Vector; + +import com.cpic.xim.utils.files.UploadedFile; import com.cpic.xim.web.controllers.QueryResponse; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/SaveUploadFile.java b/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/SaveUploadFile.java deleted file mode 100644 index 20f51fc..0000000 --- a/code/backend/RegulatoryManagementBackend/src/main/java/com/cpic/xim/web/controllers/fileupload/SaveUploadFile.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @Author: Kane Wang - * @Date: 2025-10-16 09:46:42 - * @LastEditors: Kane Wang - * @LastModified: 2025-10-16 15:16:57 - * @FilePath: src/main/java/com/cpic/xim/web/controllers/fileupload/SaveUploadFile.java - * @Description: - * - * Copyright (c) 2025 by Kane All rights reserved - */ -package com.cpic.xim.web.controllers.fileupload; - -import java.io.File; -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.HashMap; -import org.springframework.web.multipart.MultipartFile; - - -public class SaveUploadFile -{ - public static HashMap saveUploadFile( - MultipartFile[] files, - String tempFilePath - ) - throws ProcessUploadedFileException - { - HashMap savedFiles = new HashMap<>(); - // File dir = new File( tempFilePath ); - String fileName = ""; - String fullPath; - - if ( !(tempFilePath.endsWith( "/" ) || tempFilePath.endsWith( "\\" )) ) - { - fullPath = tempFilePath + "/"; - } - else - { - fullPath = tempFilePath; - } - - try - { - for ( MultipartFile file : files ) - { - // 空文件跳过 - if ( file.isEmpty() ) - { - continue; - } - - // 文件名前加上时间戳,避免覆盖 - Long milliSecond = LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli(); - - fileName = String.valueOf( milliSecond ) + " - " + file.getOriginalFilename(); - File destFile = new File( tempFilePath, fileName ); - - file.transferTo( destFile ); - - savedFiles.put( fileName, fullPath + fileName ); - } - } - catch ( IOException error ) - { - throw new ProcessUploadedFileException( "临时目录" + tempFilePath + "保存文件" + fileName + "失败!" ); - } - - return savedFiles; - } -}