java 本地前后端文件上传

文件上传

前置要求(三要素)

  1. 方式为必须为post
  2. 表单编码类型必须为multipart/form-data
  3. 文件表单项对应类型为file

后端原理

后端文件的传输基于MultipartFile类,以下为部分常用方法:

1
2
3
4
5
String getOriginalFilename(); // 获取原始文件名
void transferTo(File dest); // 将接收到的文件转存到磁盘中
long getSize(); // 获取文件大小(b)
byte[] getBytes(); // 获取文件内容的字节数组
InputStream getInputStream(); // 获取接收文件的输入流

实操方法

controller部分:

1
2
3
4
@PostMapping("/upload")
public Result<String> upload(MultipartFile file) {
return Result.success(service.upload(file));
}

service部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
public String upload(MultipartFile file) {
try {
// 检验数据合法性
var filename = file.getOriginalFilename();
if (filename == null) throw new IOException("上传文件错误,获取不到文件名");
// 要防止文件被覆写,使用 uuid 保证文件命名的唯一性
// 本地磁盘位置,要拼接“+ "\\" + uuid + OriginalFileName(如果有)”
var newFilename = UUID.randomUUID() + (filename.contains(".") ? filename.substring(file.getOriginalFilename().lastIndexOf(".")) : "");
var descPath = "C:\\路径\\位置" + "\\" + newFilename;
// 新添加的文件 new 一个 File 对象即可
file.transferTo(new File(descPath));
log.info("文件上传成功 {}", newFilename);
return descPath;
} cache(IOException e) {
// 自定义错误方式……
}
return null;
}

本地资源映射(项目路径外)

经此配置后,前端只需访问本地后端对应url即可访问文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
public class WebConfig implements WebMvcConfigurer {

/**
* 配置Spring Boot的静态资源处理逻辑。
* 本方法重写了WebMvcConfigurer接口的addResourceHandlers方法,用于指定应用程序如何处理静态资源请求。
*
* @param registry ResourceHandlerRegistry实例,用于注册资源处理器。
* 通过调用其addResourceHandler和addResourceLocations方法,可以指定哪些URL模式应该映射到哪里寻找静态资源。
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("配置本地资源映射...");

// 定义资源处理路径,即任何以/localRes/开头的URL请求都将被处理
var resourceHandler = "/localRes/**";
// 定义资源的实际存储位置,这里使用了文件系统的绝对路径
var resourceLocations = "file:C:/{资源绝对路径}/";
// 将资源处理路径和资源位置注册到Spring Boot的资源处理器中
registry.addResourceHandler(resourceHandler).addResourceLocations(resourceLocations);
}
}