前言

首先来区别一下MultipartFile和File:

  • MultipartFile是 Spring 框架的一部分,File是 Java 标准库的一部分。
  • MultipartFile主要用于接收上传的文件,File主要用于操作系统文件。

MultipartFile转换为File

使用 transferTo

这是一种最简单的方法,使用MultipartFile自带的transferTo 方法将MultipartFile转换为File,这里通过上传表单文件,将MultipartFile转换为File格式,然后输出到特定的路径,具体写法如下。

image-20240615113226175

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@RestController
public class FileController {
private static final String UPLOAD_DIR = "C:\\desktop\\file";

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
// Check if the file is empty
if (file.isEmpty()) {
return "文件为空";
}

try {
// Ensure the upload directory exists
File uploadDir = new File(UPLOAD_DIR);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}

// Save the file to the specified directory
File targetFile = new File(UPLOAD_DIR + File.separator + file.getOriginalFilename());
file.transferTo(targetFile);

return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}

使用 FileOutputStream

这是最常用的一种方法,使用 FileOutputStream 可以将字节写入文件。具体写法如下。

image-20240615113255746

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@RestController
public class FileController {
private static final String UPLOAD_DIR = "C:\\desktop\\file";

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
// Check if the file is empty
if (file.isEmpty()) {
return "文件为空";
}

try {
// Ensure the upload directory exists
File uploadDir = new File(UPLOAD_DIR);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}

// Save the file to the specified directory
File targetFile = new File(UPLOAD_DIR + File.separator + file.getOriginalFilename());
try (FileOutPutStream fos = new FileOutputStream(targetFile)) {
fos.write(file.getBytes());
}

return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}

使用Java NIO

Java NIO 提供了文件复制的方法。具体写法如下。

image-20240615113416663

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RestController
public class FileController {
private static final string UPLOAD_DIR = "C:\\desktop\lfile";
@PostMapping("/upload" )
public String uploadFile(@RequestParam("file")MultipartFile file){
// Check if the file is empty
if(file.isEmpty()){
return“文件为空";
Path uploadPath = Paths.get(UPLOAD DIR);
try {
// Ensure the upload directory exists
File uploadDir = new File(UPLOAD DIR);
if(!uploadDir.exists()){
uploadDir.mkdirs();
// Save the file to the specified directory using Java NIO
Path targetPath = uploadPath.resolve(file.getOriginalFilename());
Files.copy(file.getInputstream(), targetPath, standardCopyOptiOn.REPLACE EXISTING);
return“上传成功";
}catch(I0Exception e){
e.printstackTrace();
return“上传失败";
}
}
}

File装换为MultipartFile

从File转换为MultipartFile 通常在测试或模拟场景中使用,生产环境一般不这么用,这里只介绍一种最常用的方法。

使用 MockMultipartFile

在转换之前先确保引入了spring-test 依赖(以Maven举例)

1
2
3
4
5
6
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>version</version>
<scope>test</scope>
</dependency>

通过获得File文件的名称、mime类型以及内容将其转换为MultipartFile格式。具体写法如下。

image-20240615113555637

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MultiToFileUtil {
public static Multipartfile convertMockMultipartfile(String filePath) throws IoException{
//根据提供的文件路径创建Path对象
Path path= Paths.get(filePath);
//获取文件的名字
String name = path.getFileName().tostring();
//使用 Java NI0的Files 类探测文件的 MIME 类型
String contentType =Files.probeContentType(path);
//读取文件内容为字节数组
bytel] content = Files.readAllBytes(path);
return new MockMultipartFile(name, name, contentType, content);
}
}