基于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文件上传下载分享内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合RestTemplate用法的实现

    SpringBoot整合RestTemplate用法的实现

    本篇主要介绍了RestTemplate中的GET,POST,PUT,DELETE、文件上传和文件下载6大常用的功能,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Java实现多任务执行助手

    Java实现多任务执行助手

    这篇文章主要为大家详细介绍了Java实现多任务执行助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringBoot框架aop切面的execution表达式解读

    SpringBoot框架aop切面的execution表达式解读

    这篇文章主要介绍了SpringBoot框架aop切面的execution表达式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot使用@Async注解处理异步事件的方法

    SpringBoot使用@Async注解处理异步事件的方法

    在现代应用程序中,异步编程已经成为了必备的技能,异步编程使得应用程序可以同时处理多个请求,从而提高了应用程序的吞吐量和响应速度,在SpringBoot 中,我们可以使用 @Async 注解来实现异步编程,本文将介绍 @Async 注解的使用方法和注意事项
    2023-09-09
  • SpringBoot之Profile的两种使用方式详解

    SpringBoot之Profile的两种使用方式详解

    当在不同的环境下,想通过修改配置文件来连接不同的数据库,比如在开发过程中启动项目时,想连接开发环境对应的数据库,可以在配置文件中指定environment=dev,其他环境类似,此时就需要用到Spring为我们提供的Profile功能,本文给大家介绍了SpringBoot之Profile的两种使用方式
    2024-10-10
  • springboot pom文件加入监控依赖后没有起作用的解决

    springboot pom文件加入监控依赖后没有起作用的解决

    这篇文章主要介绍了springboot pom文件加入监控依赖后没有起作用的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • idea 列编辑模式取消的操作

    idea 列编辑模式取消的操作

    这篇文章主要介绍了idea 列编辑模式取消的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 由浅入深快速掌握Java 数组的使用

    由浅入深快速掌握Java 数组的使用

    Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素
    2022-04-04
  • JAVA通过XPath解析XML性能比较详解

    JAVA通过XPath解析XML性能比较详解

    本篇文章主要介绍了JAVA通过XPath解析XML性能比较详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有大小,当池子体积不够承载时,就涉及到拒绝策略。JDK中已预设了 4 种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景以及还能扩展哪些拒绝策略
    2021-11-11

最新评论