Spring Boot如何将音视频上传至类路径持久化文件夹并解决丢失问题?
解决Spring Boot文件存储在target目录丢失的问题
嗨,刚上手Spring Boot踩这个坑太正常了!你遇到的问题根源其实很明确:target是Maven/Gradle的构建输出目录,每次执行clean、package命令,或者IDE自动重新构建项目时,这个目录都会被清空重建,所以存在这里的文件自然会消失。
下面给你一套靠谱的解决方案,一步步来:
1. 改用项目外部的持久化目录存储文件
别再把文件放在项目内部的target或src/main/resources这类受构建影响的目录了,选一个项目外的固定路径,比如:
- Linux/macOS:
/opt/my-app/upload-storage - Windows:
D:/my-app/upload-storage
配置存储路径
在application.properties(或application.yml)里添加自定义配置,方便后续代码复用:
# 自定义文件存储路径 file.upload-dir=/opt/my-app/upload-storage
在控制器中使用该路径存储文件
修改你的上传逻辑,读取配置的路径来保存文件:
import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @RestController public class UploadController { @Value("${file.upload-dir}") private String uploadDir; @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { // 确保存储目录存在,不存在则创建 File directory = new File(uploadDir); if (!directory.exists()) { directory.mkdirs(); } // 生成唯一文件名,避免覆盖 String fileName = UUID.randomUUID().toString() + "-" + file.getOriginalFilename(); File destFile = new File(uploadDir + File.separator + fileName); // 保存文件 file.transferTo(destFile); // 返回文件名用于后续访问 return fileName; } }
2. 配置静态资源映射,让Thymeleaf能访问外部文件
因为文件存在项目外,默认Spring Boot不会把这个目录作为静态资源路径,所以需要配置WebMvcConfigurer添加映射:
import org.springframework.beans.factory.annotation.Value; 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 WebMvcConfig implements WebMvcConfigurer { @Value("${file.upload-dir}") private String uploadDir; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 映射URL路径 /upload/** 到实际存储目录 registry.addResourceHandler("/upload/**") .addResourceLocations("file:" + uploadDir + "/"); } }
之后在Thymeleaf里就能这样访问文件了:
<!-- 图片 --> <img th:src="@{/upload/{fileName}(fileName=${file.name})}" alt="上传的图片"> <!-- 视频 --> <video th:src="@{/upload/{fileName}(fileName=${file.name})}" controls></video>
3. 额外注意事项
- 权限问题:确保运行Spring Boot应用的用户对存储目录有读写权限,否则会出现文件保存失败的情况。
- 大文件上传配置:你提到文件约20MB,需要在
application.properties中配置上传大小限制:
# 单个文件最大大小 spring.servlet.multipart.max-file-size=20MB # 请求总文件大小 spring.servlet.multipart.max-request-size=20MB
这样配置后,你的文件就会存在一个稳定的外部目录里,不管怎么重启项目、重新构建,文件都不会丢失啦!
内容的提问来源于stack exchange,提问作者PascalP
相关产品推荐
相关产品推荐

