编写后端接收上传文件代码。

This commit is contained in:
2025-10-16 11:14:32 +08:00
parent 6cae285034
commit 2eaedf52fe
7 changed files with 203 additions and 41 deletions

View File

@@ -1,8 +1,12 @@
/* /*
* @Author: Kane * @Author: Kane
*
* @Date: 2023-04-05 22:34:36 * @Date: 2023-04-05 22:34:36
*
* @LastEditors: Kane * @LastEditors: Kane
*
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/QueryResponse.java * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/QueryResponse.java
*
* @Description: * @Description:
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
@@ -17,7 +21,7 @@ public class QueryResponse
private boolean success; private boolean success;
@JsonProperty( "message" ) @JsonProperty( "message" )
private String message; private String message;
public QueryResponse( boolean success, String message ) public QueryResponse( boolean success, String message )
{ {
@@ -54,8 +58,8 @@ public class QueryResponse
@Override @Override
public int hashCode() public int hashCode()
{ {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + (success ? 1231 : 1237); result = prime * result + (success ? 1231 : 1237);
result = prime * result + ((message == null) ? 0 : message.hashCode()); result = prime * result + ((message == null) ? 0 : message.hashCode());
return result; return result;
@@ -70,7 +74,7 @@ public class QueryResponse
return false; return false;
if ( getClass() != obj.getClass() ) if ( getClass() != obj.getClass() )
return false; return false;
QueryResponse other = (QueryResponse) obj; QueryResponse other = ( QueryResponse ) obj;
if ( success != other.success ) if ( success != other.success )
return false; return false;
if ( message == null ) if ( message == null )

View File

@@ -1,14 +1,13 @@
/* /**
* @Author: Kane * @Author: Kane Wang <wangkane@qq.com>
* @Date: 2023-01-22 23:11:26 * @Date: 2025-10-15 11:42:56
* @LastEditors: Kane * @LastEditors: Kane Wang
* @LastEditTime: 2023-10-23 17:01:29 * @LastModified: 2025-10-15 17:48:52
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java * @FilePath: src/main/java/com/cpic/xim/web/controllers/fileupload/FileUpload.java
* @Description: 用于接受上传文件的Controller。 * @Description: 用于接受上传文件的Controller。
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) 2025 by Kane All rights reserved
*/ */
package com.cpic.xim.web.controllers.fileupload; package com.cpic.xim.web.controllers.fileupload;
import java.io.File; import java.io.File;
@@ -22,11 +21,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RequestMethod;
// @SuppressWarnings( "unused" ) // @SuppressWarnings( "unused" )
@Controller @Controller
@RequestMapping( path = "/file" ) @RequestMapping( path = "/file" )
public class FileUpload public abstract class FileUpload
{ {
/** /**
* 接收上传文件,并保存到临时目录: * 接收上传文件,并保存到临时目录:
@@ -34,26 +35,30 @@ public class FileUpload
* 2、保存时不更改文件名会覆盖同名文件。 * 2、保存时不更改文件名会覆盖同名文件。
* 3、MultipartFile参数形参名称必须和请求form中file标签的name属性一致否则值为null。 * 3、MultipartFile参数形参名称必须和请求form中file标签的name属性一致否则值为null。
* 4、返回值为接收结果和文件保存绝对路径。 * 4、返回值为接收结果和文件保存绝对路径。
*
* @param taskName 任务名称字符串 * @param taskName 任务名称字符串
* @param files MultipartFile结构的文件对象 * @param files MultipartFile结构的文件对象
* @param request HttpServletRequest对象实例 * @param request HttpServletRequest对象实例
* @return 返回一个FileUploadResult对象包含上传结果。 * @return 返回一个FileUploadResult对象包含上传结果。
*/ */
@RequestMapping( path = "/file-upload.do" ) // @RequestMapping( path = "/file-upload.do" )
@ResponseBody // @ResponseBody
public FileUploadResult getUploadFile( @RequestParam( "task-name" ) String taskName, public FileUploadResult getUploadFile(
@RequestParam( "files" ) MultipartFile file, HttpServletRequest request ) @RequestParam( "task-name" ) String taskName,
@RequestParam( "files" ) MultipartFile file,
HttpServletRequest request
)
{ {
// session id用来创建临时目录避免重复 // session id用来创建临时目录避免重复
String sessionID = request.getSession().getId(); String sessionID = request.getSession().getId();
FileUploadResult result = new FileUploadResult(); FileUploadResult result = new FileUploadResult();
Vector<String> fileNames = new Vector<String>(); Vector<String> fileNames = new Vector<String>();
result.setSuccess( true ); result.setSuccess( true );
result.setMessage( "上传成功!" ); result.setMessage( "上传成功!" );
String filePath = request.getServletContext().getRealPath( "/temp/upload/" + sessionID ); String filePath = request.getServletContext().getRealPath( "/temp/upload/" + sessionID );
File dir = new File( filePath ); File dir = new File( filePath );
if ( !dir.mkdirs() ) if ( !dir.mkdirs() )
{ {
@@ -69,11 +74,10 @@ public class FileUpload
else else
{ {
// 保存文件到临时目录 // 保存文件到临时目录
Long milliSecond = Long milliSecond = LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli();
LocalDateTime.now().toInstant( ZoneOffset.of( "+8" ) ).toEpochMilli(); String fileName = String.valueOf( milliSecond ) + file.getOriginalFilename();
String fileName = String.valueOf( milliSecond ) + file.getOriginalFilename(); File destFile = new File( filePath, fileName );
// String fileName = file.getOriginalFilename(); // String fileName = file.getOriginalFilename();
File destFile = new File( filePath, fileName );
try try
{ {
@@ -94,4 +98,46 @@ public class FileUpload
return result; return result;
} }
@RequestMapping( path = "/file-upload.do" )
@ResponseBody
public static FileUploadResult saveUploadFile(
@RequestParam( "file-name" ) String fileName,
@RequestParam( "files" ) MultipartFile file,
HttpServletRequest request
)
{
// session id用来创建临时目录避免重复
String sessionID = request.getSession().getId();
FileUploadResult result = new FileUploadResult();
MultipartFile[] files = new MultipartFile[1];
result.setSuccess( true );
result.setMessage( "上传成功!" );
String filePath = request.getServletContext().getRealPath( "/temp/upload/" + sessionID );
File dir = new File( filePath );
// 创建临时目录
if ( !dir.mkdirs() )
{
result.setSuccess( false );
result.setMessage( "创建临时目录失败:" + filePath );
return result;
}
try
{
SaveUploadFile.saveUploadFile( files, filePath );
}
catch ( ProcessUploadedFileException error )
{
result.setSuccess( false );
result.setMessage( error.getMessage() );
}
return result;
}
} }

View File

@@ -1,9 +1,14 @@
/* /*
* @Author: Kane * @Author: Kane
*
* @Date: 2023-01-23 22:56:17 * @Date: 2023-01-23 22:56:17
*
* @LastEditors: Kane * @LastEditors: Kane
*
* @LastEditTime: 2023-10-06 00:32:47 * @LastEditTime: 2023-10-06 00:32:47
*
* @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/FileUpload/FileUploadResult.java * @FilePath: /desktop_archievement_backend/src/main/java/com/cpic/xim/web/controllers/FileUpload/FileUploadResult.java
*
* @Description: * @Description:
* *
* Copyright (c) ${2022} by Kane, All Rights Reserved. * Copyright (c) ${2022} by Kane, All Rights Reserved.
@@ -25,13 +30,16 @@ public class FileUploadResult extends QueryResponse
/** /**
* 构造函数 * 构造函数
* @param success 是否上传成功 *
* @param message 消息字符串 * @param success 是否上传成功
* @param message 消息字符串
* @param fileList 文件绝对路径字符串数组 * @param fileList 文件绝对路径字符串数组
*/ */
public FileUploadResult( boolean success, public FileUploadResult(
String message, boolean success,
Vector<String> fileList ) String message,
Vector<String> fileList
)
{ {
super( success, message ); super( success, message );

View File

@@ -0,0 +1,26 @@
/**
* @Author: Kane Wang <wangkane@qq.com>
* @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
* @Description:
*
* Copyright (c) 2025 by Kane All rights reserved
*/
package com.cpic.xim.web.controllers.fileupload;
import java.io.IOException;
public class ProcessUploadedFileException extends IOException
{
ProcessUploadedFileException()
{
super("上传文件失败!");
}
ProcessUploadedFileException( String message )
{
super(message);
}
}

View File

@@ -0,0 +1,73 @@
/**
* @Author: Kane Wang <wangkane@qq.com>
* @Date: 2025-10-16 09:46:42
* @LastEditors: Kane Wang
* @LastModified: 2025-10-16 10:50:45
* @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.util.HashMap;
import org.springframework.web.multipart.MultipartFile;
public class SaveUploadFile
{
public static HashMap<String, String> saveUploadFile(
MultipartFile[] files,
String tempFilePath
)
throws ProcessUploadedFileException
{
HashMap<String, String> savedFiles = new HashMap<>();
// File dir = new File( tempFilePath );
String fileName = "";
String fullPath;
// if ( !dir.mkdir() )
// {
// // 创建目录失败
// throw new ProcessUploadedFileException( "创建临时目录失败:" + tempFilePath );
// }
if ( !(tempFilePath.endsWith( "/" ) || tempFilePath.endsWith( "\\" )) )
{
fullPath = tempFilePath + "/";
}
else
{
fullPath = tempFilePath;
}
try
{
for ( MultipartFile file : files )
{
// 空文件跳过
if ( file.isEmpty() )
{
continue;
}
fileName = 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;
}
}

View File

@@ -27,7 +27,12 @@ public class CrosFilter implements Filter
private static Logger logger = LoggerFactory.getLogger( CrosFilter.class ); private static Logger logger = LoggerFactory.getLogger( CrosFilter.class );
/** /**
*
* @param req * @param req
* @param resp
* @param chain
* @throws ServletException
* @throws IOException
*/ */
@Override @Override
public void doFilter( public void doFilter(