当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/394050.html

相关文章:

  • 蝉镜-AI数字人视频创作平台
  • Linux入门(五)
  • MySqL-day4_03(索引)
  • Vue 深度选择器(:deep)完全指北:从“能用”到“用好”
  • [Nodejs+LangChain+Ollama] 1.第一个案例
  • 设计模式2.【备忘录模式】
  • Spring Boot 入门:快速构建现代 Java 应用的利器
  • Redis 实例 CPU 飙高到 90%,如何排查和解决?
  • 中国女篮备战全运会,宫鲁鸣重点培养年轻核心
  • 【Qt】常用控件1——QWidget
  • 9.21关于大模型推理未来的思考
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘uvicorn’ 问题
  • 变分自编码器(VAE):生成模型的另一条技术路线
  • 【LVS入门宝典】LVS NAT模式实战指南:ip_forward、iptables与SNAT、DNAT规则配置详解
  • 【Android】BottomSheet的三种使用
  • Spring MVC 九大组件源码深度剖析(八):RequestToViewNameTranslator - 视图名转换的奥秘
  • 在Linux环境下安装和卸载DMETL5数据迁移工具
  • 《计算》第五六章读书笔记
  • daily notes[47]
  • 模电基础:放大电路的分析方法---图解法
  • Windows10系统Web UI自动化测试学习系列1--介绍(序章-万事开头难)
  • 安装vllm的艰苦过程
  • 探索 Event 框架实战指南:微服务系统中的事件驱动通信:
  • FPGA超高速接口GTP_GTY_GTX使用说明
  • Blender常用第三方插件总结
  • Kurt-Blender零基础教程:第2章:建模篇——第3节:陈列/父子级/蒙皮/置换修改器与小狐狸角色建模
  • npm启动项目报错“无法加载文件……”
  • 从 0 到 1 精通 Nacos:服务发现与配置中心的实战指南
  • 基于DrissionPage的趣易百影院数据采集实战指南
  • github十大开源FPGA项目