You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:39