编写后端接收上传文件代码。
This commit is contained in:
@@ -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 )
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user