springBoot图片本地存储
@RestController
@RequestMapping("/admin/common")
@Slf4j
public class commonController {@PostMapping("/upload")public Result<String> upload(MultipartFile file) {log.info("文件上传:{}", file.getOriginalFilename()); try {// 第一步:验证文件是否为图片类型isImageFile(file.getOriginalFilename());// 第二步:生成唯一文件名String uniqueFileName = generateUniqueFileName(file.getOriginalFilename());// 第三步:获取项目根目录的绝对路径String projectRoot = System.getProperty("user.dir");String uploadDir = projectRoot + File.separator + "sky-server" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "static" + File.separator + "images" + File.separator;log.info("文件保存目录:{}", uploadDir);// 第四步:确保目录存在ensureDirectoryExists(uploadDir);// 第五步:构建完整的文件路径Path filePath = Paths.get(uploadDir + uniqueFileName);// 第六步:保存文件Files.write(filePath, file.getBytes());// 第七步:构建返回的URL(相对路径)String returnUrl = "/api/images/" + uniqueFileName;log.info("文件保存成功:{}", filePath.toString());return Result.success(returnUrl);} catch (RuntimeException e) {// 处理验证异常log.error("文件验证失败:{}", e.getMessage());return Result.error(e.getMessage());} catch (IOException e) {// 处理文件保存异常log.error("文件保存失败:{}", e.getMessage());return Result.error("文件保存失败");}}
核心的点路径配置:
// ❌ 错误:相对路径会导致文件保存到项目外
String uploadDir = "src/main/resources/static/images/";// ✅ 正确:使用绝对路径确保文件保存到项目内
String projectRoot = System.getProperty("user.dir");
String uploadDir = projectRoot + File.separator + "sky-server" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "static" + File.separator + "images" + File.separator;
springboot 配置静态资源映射:
config下面的一个类
方法一:WebMvcConfigurationSupport
@Configuration // ① Spring配置类注解
public class WebMvcConfiguration extends WebMvcConfigurationSupport { // ② 继承Spring MVC配置支持类@Override // ③ 重写父类方法protected void addResourceHandlers(ResourceHandlerRegistry registry) { // ④ 添加资源处理器的方法// ⑤ 配置静态资源映射registry.addResourceHandler("/images/**") // ⑥ URL访问路径.addResourceLocations("classpath:/static/images/"); // ⑦ 实际文件位置// ⑧ 可以配置多个映射registry.addResourceHandler("/files/**") // ⑨ 另一个URL路径.addResourceLocations("classpath:/static/files/"); // ⑩ 对应的文件位置}
}详细解释:
① @Configuration
标记这是一个Spring配置类
Spring会自动扫描并加载这个配置
等同于XML配置文件的作用
② extends WebMvcConfigurationSupport
继承Spring MVC的核心配置支持类
提供了完整的MVC配置功能
⚠️ 注意:会禁用Spring Boot的自动配置
③ @Override
重写父类的方法
编译时检查方法签名是否正确
④ addResourceHandlers(ResourceHandlerRegistry registry)
专门用于配置静态资源处理的方法
registry:资源处理器注册表,用来注册映射规则
⑤⑥ registry.addResourceHandler("/images/**")
添加一个资源处理器
"/images/**":URL访问模式
/images/:基础路径
**:匹配任意层级的子路径
示例:/images/photo.jpg、/images/folder/sub/photo.jpg
⑦ .addResourceLocations("classpath:/static/images/")
指定实际文件存储位置
classpath::类路径前缀
/static/images/:相对于classpath的路径
实际对应:src/main/resources/static/images/
方法二:WebMvcConfigurer接口(推荐方式)
@Configuration // ① Spring配置类注解
public class WebMvcConfiguration implements WebMvcConfigurer { // ② 实现Spring MVC配置接口@Override // ③ 重写接口方法public void addResourceHandlers(ResourceHandlerRegistry registry) { // ④ 添加资源处理器方法// ⑤ 图片资源映射registry.addResourceHandler("/images/**") // ⑥ URL访问路径.addResourceLocations("classpath:/static/images/"); // ⑦ 实际文件位置}
}implements WebMvcConfigurer
实现Spring MVC配置接口
✅ 推荐:不会禁用Spring Boot自动配置
只需要重写需要的方法
④ public void addResourceHandlers
注意:这里是public,不是protected
接口方法必须是public
🔍 两种方式的区别
方法三:配置文件方式(application.yml)
spring:web:resources:static-locations: classpath:/static/,classpath:/public/,classpath:/resources/,classpath:/META-INF/resources/,file:/path/to/your/files/mvc:static-path-pattern: /static/**
映射原理图解:
用户请求: http://localhost:8080/images/photo.jpg
↓
Spring MVC: 匹配 "/images/**" 模式
↓
资源定位: classpath:/static/images/photo.jpg
↓
实际路径: src/main/resources/static/images/photo.jpg
↓
返回文件: photo.jpg