一:依赖安装
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
二:上传配置
在application.yaml配置上传属性,路径地址为:src/main/resources/application.yaml
spring:
servlet:
multipart:
enabled: true # 开启文件上传,默认true
max-file-size: 10MB # 单个文件最大大小
max-request-size: 50MB # 单次请求总文件大小
file-size-threshold: 2KB # 超过阈值写入临时文件
三:文件上传示例
package com.example.demo.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.UUID;
@RestController
@RequestMapping("/upload")
public class UploadController {
private static final String UPLOAD_PATH = "upload/";
//单文件上传
@PostMapping
public String upload(@RequestParam("file") MultipartFile file)
{
if (file.isEmpty()) {
return "文件不能为空";
}
//获取原始文件名
String originalFilename = file.getOriginalFilename();
if (originalFilename == null || !originalFilename.contains(".")) {
return "文件名不合法";
}
//获取文件后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//格式校验
String[] allowSuffix = {".jpg", ".png", ".jpeg", ".gif"};
if (!Arrays.asList(allowSuffix).contains(suffix.toLowerCase())){
return "不支持该文件类型";
}
//定义保存文件名
String fileName = UUID.randomUUID() + suffix;
File dest = new File(UPLOAD_PATH, fileName).getAbsoluteFile();
File dir = dest.getParentFile();
if (!dir.exists() && !dir.mkdirs()) {
return "上传失败:目录创建失败";
}
try {
file.transferTo(dest);
return "上传成功,文件名:" + fileName;
} catch (IOException e) {
e.printStackTrace();
return "上传失败:" + e.getMessage();
}
}
//多文件上传
@PostMapping("/batch")
public String batch(@RequestParam("files") MultipartFile[] files)
{
if (files == null || files.length == 0) {
return "请选择文件";
}
for (MultipartFile file : files) {
if (!file.isEmpty()) {
//获取原始文件名
String originalFilename = file.getOriginalFilename();
if (originalFilename == null || !originalFilename.contains(".")) {
return "文件名不合法";
}
//获取文件后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//格式校验
String[] allowSuffix = {".jpg", ".png", ".jpeg", ".gif"};
if (!Arrays.asList(allowSuffix).contains(suffix.toLowerCase())){
return "不支持该文件类型";
}
//定义保存文件名
String fileName = UUID.randomUUID() + suffix;
File dest = new File(UPLOAD_PATH, fileName).getAbsoluteFile();
File dir = dest.getParentFile();
if (!dir.exists() && !dir.mkdirs()) {
return "上传失败:目录创建失败";
}
try {
file.transferTo(dest);
} catch (IOException e) {
e.printStackTrace();
return "部分文件上传失败";
}
}
}
return "批量上传完成";
}
}
四:html示例
<!DOCTYPE html>
<html>
<body>
<form action="http://xxx/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit">上传</button>
</form>
<hr>
<!-- 多文件 -->
<form action="http://xxx/upload/batch" method="post" enctype="multipart/form-data">
<input type="file" name="files" multiple/>
<button type="submit">批量上传</button>
</form>
</body>
</html>
五:配置远程访问资源
如果需要直接通过 url 访问上传图片,需要配置静态资源映射
package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
// 访问路径 /upload/** 映射到本地 /upload/
registry.addResourceHandler("upload/**")
.addResourceLocations("file:upload/");
}
}