基于SpringBoot框架实现文件上传下载分享功能

 更新时间:2025年06月08日 08:40:39   作者:寅灯  
在当今的Web应用开发中,文件上传与下载功能是极为常见且重要的需求,无论是用户上传头像、分享文档,还是系统生成报告供用户下载,都离不开这一功能模块,SpringBoot作为一款流行的Java开发框架,为我们提供了简洁高效的方式来实现文件上传与下载,需要的朋友可以参考下

SpringBoot 文件上传下载是我们常用的功能,比如图片、视频上传、下载和更新等功能的实现。下面我们详细分析一下:

1、pom.xml包引入

<!-- 基础 web 依赖(包含文件上传支持)  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<!-- 文件操作工具类 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

2、存储目录设计

/data/project_files/
    ├── images/
    │   ├── 202405/
    │   └── 202406/
    └── videos/
        ├── 202405/
        └── 202406/
  • 使用 UUID 生成唯一文件名(保留原始扩展名)
  • 按年月生成子目录(防止单目录文件过多)
  • 推荐存储绝对路径到数据库(如:/images/202405/uuid123.jpg)

3、配置文件信息

# win环境文件存储根目录 
file.upload-dir=D:/data/project_files/
 
#linux环境
file.upload-dir=/data/project_files/
 
# 上传大小限制(默认1MB,按需调整) 
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB

4、上传接口

@PostMapping("/upload")
public ApiResult uploadFile(@RequestParam("file") MultipartFile file, 
                               @RequestParam String fileType) throws IOException {
        // 验证文件类型
        if (!Arrays.asList("image", "video").contains(fileType)) {
            return ApiResult.error("Invalid file type");
        }
 
        // 生成存储路径
        String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
        String fileExt = FilenameUtils.getExtension(file.getOriginalFilename());
        String uuid = UUID.randomUUID().toString();
        String relativePath = String.format("/%s/%s/%s.%s", 
            fileType + "s", datePath, uuid, fileExt);
        
        // 保存文件
        File dest = new File(uploadDir + relativePath);
        FileUtils.forceMkdirParent(dest);
        file.transferTo(dest);
 
        return ApiResult.ok(relativePath);
    }

直接获取下载地址上传方式

    @PostMapping("/uploadFile")
    @ApiOperation(value="文件上传",notes = "文件上传-√")
    public String uploadFile(@RequestParam("file")MultipartFile file, @RequestParam String fileType) throws IOException {
        // 验证文件类型
        if (!Arrays.asList("image", "video").contains(fileType)) {
            return CommonResponse.buildErrorResponse("Error file type");
        }
        // 生成存储路径
        String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));
        String fileExt = FilenameUtils.getExtension(file.getOriginalFilename());
        String uuid = UUID.randomUUID().toString();
        String relativePath = String.format("/%s/%s/%s.%s",
                fileType + "s", datePath, uuid, fileExt);
 
        // 保存文件
        File dest = new File(uploadDir + relativePath);
        FileUtils.forceMkdirParent(dest);
        file.transferTo(dest);
        log.info("filePath:{}",fileIpPortUrl+relativePath);
        return (fileIpPortUrl+relativePath);
    }

5、下载接口

1)接口下载

 @GetMapping("/download")
    public ResponseEntity<Resource> downloadFile(@RequestParam String filePath) throws IOException {
        Path path = Paths.get(uploadDir + filePath);
        Resource resource = new UrlResource(path.toUri());
        
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, 
                    "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }

2)原路径获取下载

    @GetMapping("/download/**")
    @ApiOperation(value="文件下载接口",notes = "文件下载接口-√")
    public ResponseEntity<Resource> downloadFile(HttpServletRequest request) throws IOException {
        // 获取完整文件路径(需截掉前缀路径)
        String filePath = request.getServletPath()
                .replaceFirst("/file/******/", "");
        log.info("filePath:{}",filePath);
        // 路径安全校验
        if (filePath.contains("..")) {
            return ResponseEntity.badRequest().build();
        }
 
        Path path = Paths.get(uploadDir + File.separator + filePath);
        log.info("path:{}",path);
        Resource resource = new UrlResource(path.toUri());
        log.info("toUri:{}",path.toUri());
        if (!resource.exists()) {
            return ResponseEntity.notFound().build();
        }
 
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION,
                        "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }

 6、修改文件

    @PostMapping("/update")
    public ApiResult updateFile(@RequestParam("file") MultipartFile file,
                               @RequestParam String oldFilePath) throws IOException {
        // 删除旧文件
        File oldFile = new File(uploadDir + oldFilePath);
        if (oldFile.exists()) {
            FileUtils.forceDelete(oldFile);
        }
        
        // 上传新文件(复用上传逻辑)
        return uploadFile(file, parseFileType(oldFilePath));
    }

或者

    
 
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
 
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.UUID;
 
 
 
 
   @PostMapping("/update")
    public String updateFile(@RequestParam("file") MultipartFile file,
                                @RequestParam String oldFilePath, @RequestParam String fileType) throws IOException {
        // 删除旧文件
        File oldFile = new File(uploadDir + oldFilePath);
        if (oldFile.exists()) {
            FileUtils.forceDelete(oldFile);
        }
        // 上传新文件(复用上传逻辑)
        return uploadFile(file, fileType);
    }

到此,文件上传下载分享完成。

到此这篇关于基于SpringBoot框架实现文件上传下载分享功能的文章就介绍到这了,更多相关SpringBoot文件上传下载分享内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java对XML文件增删改查操作示例

    Java对XML文件增删改查操作示例

    这篇文章主要介绍了Java对XML文件增删改查操作,结合完整实例形式分析了java针对xml格式数据的常见读写、增删改查等操作技巧,需要的朋友可以参考下
    2018-12-12
  • Spring Security使用数据库认证及用户密码加密和解密功能

    Spring Security使用数据库认证及用户密码加密和解密功能

    这篇文章主要介绍了Spring Security使用数据库认证及用户密码加密和解密,本文通过代码与截图的形式给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • SpringBoot自动配置@EnableAutoConfiguration过程示例

    SpringBoot自动配置@EnableAutoConfiguration过程示例

    这篇文章主要为大家介绍了SpringBoot自动配置@EnableAutoConfiguration的过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • SpringBoot中实现JSON转Word格式的示例详解

    SpringBoot中实现JSON转Word格式的示例详解

    这篇文章主要为大家详细介绍了如何使用SpringBoot实现JSON转Word格式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • Maven基础之如何修改本地仓库的默认路径

    Maven基础之如何修改本地仓库的默认路径

    这篇文章主要介绍了Maven基础之如何修改本地仓库的默认路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java使用FileReader.read()读取文件时乱码的两个解决方案

    Java使用FileReader.read()读取文件时乱码的两个解决方案

    文章主要讨论了在Java中使用FileReader读取文件时可能出现的乱码问题,并提出了通过指定文件编码格式和使用int类型接收读取到的字节来解决乱码的方法
    2026-01-01
  • jenkins-jdk8.0环境准备及部署过程

    jenkins-jdk8.0环境准备及部署过程

    这篇文章主要介绍了jenkins-jdk8.0环境准备及部署过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-05-05
  • 关于文件合并与修改md5值的问题

    关于文件合并与修改md5值的问题

    这篇文章主要介绍了关于文件合并与修改md5值的问题,使用本博客的方法,不仅仅可以修改md5值,还可以达到隐藏文件的目的,需要的朋友可以参考下
    2023-04-04
  • Java MyBatis可视化代码生成工具使用教程

    Java MyBatis可视化代码生成工具使用教程

    这篇文章主要介绍了Java MyBatis可视化代码生成工具使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Redisson延迟队列实现订单关闭的操作方法

    Redisson延迟队列实现订单关闭的操作方法

    Redisson的RDelayedQueue是实现订单到期关闭的利器,它比定时任务更精准、比Redis过期监听更可靠,下面一步步给大家介绍Redisson延迟队列实现订单关闭功能,感兴趣的朋友一起看看吧
    2026-03-03

最新评论