RuoYi-Geek-SpringBoot3-文件上传模块

简介: 本文介绍基于桥接模式设计的文件上传模块,解耦存储服务与业务逻辑,支持多存储服务灵活适配,适用于单服务单存储桶及多服务多存储桶场景,提升系统扩展性与开发效率。

RuoYi-Geek-SpringBoot3-文件上传模块

📌 请关注开源社区Geek-XD

基于桥接模式的文件上传模块的设计与实现

摘要

本文介绍了一种基于桥接模式设计的文件上传系统架构,通过解耦存储服务与业务逻辑,实现灵活的多存储服务支持。系统包含核心类设计、工具封装和典型应用案例,适用于单服务单存储桶及多服务多存储桶的复杂业务场景。


Vue端文件上传图片

分片上传
图片上传
文件上传


核心设计模式解析

为何选择桥接模式?

在文件上传场景中,存储服务(如OSS、S3)与存储桶配置常存在多维度组合需求。桥接模式通过将抽象(业务逻辑)与实现(存储操作)分离,有效解决了:

  • 多存储服务商的适配问题
  • 存储桶参数配置的灵活性
  • 业务逻辑(如分片上传)与底层存储的解耦

系统核心类图谱

1. 基础对象层

类名 职责说明
StorageBucket 实现基础存储操作接口,包含putObject/getObject等核心方法
StorageEntity 存储元数据实体类,封装路径、大小、ETag、存储时间等属性
StorageManagement 管理存储桶生命周期,提供createBucket/listBuckets等管理接口

2. 工具层

工具类 使用场景
StorageUtils 提供存储服务实例化与存储桶获取能力,支持多存储类型动态加载
FileOperateUtils 封装默认存储服务的快捷操作方法,简化单服务单存储桶场景下的开发复杂度

桥接模式实践

核心桥接类:StorageService

public class StorageService {
   
// 更多业务逻辑...
    /**
     * 上传文件(指定文件路径)
     *
     * @param filePath 指定上传文件的路径
     * @param file     上传的文件
     * @return 上传后的访问链接
     * @throws Exception 比如读写文件出错时
     *
     */
    public String upload(String filePath, MultipartFile file) throws Exception {
   
        FileUtils.assertAllowed(file, allowedExtension);
        if (file.getSize() > MAX_FILE_SIZE) {
   
            throw new IllegalArgumentException("文件过大");
        }
        if (this.fastUpload) {
   
            String md5 = Md5Utils.getMd5(file);
            String pathForMd5 = CacheUtils.get(CacheConstants.FILE_MD5_PATH_KEY, md5, String.class);
            if (StringUtils.isNotEmpty(pathForMd5)) {
   
                filePath = pathForMd5;
            } else {
   
                this.storageBucket.put(filePath, file);
                CacheUtils.put(CacheConstants.FILE_MD5_PATH_KEY, md5, filePath);
                CacheUtils.put(CacheConstants.FILE_PATH_MD5_KEY, filePath, md5);
            }
        } else {
   
            this.storageBucket.put(filePath, file);
        }
        return generateUrl(filePath);
    }

    // 更多业务逻辑...
}

典型应用案例

场景1:简易文件操作(单服务单存储桶)

// 上传操作
String url = FileOperateUtils.upload("images/logo.png", new File("logo.png"));

// 下载操作
FileOperateUtils.download("images/logo.png", response);

// 获取文件URL
String previewUrl = FileOperateUtils.getUrl("images/logo.png");

场景2:多存储服务操作

// 多服务初始化
StorageBucket ossBucket = StorageUtils.getStorageBucket("OSS", "default");
StorageService ossService = new StorageService(ossBucket);

// 业务操作
String ossUrl = ossService.upload("videos/demo.mp4", videoFile);

场景3:分片上传实现

// 初始化分片上传
String uploadId = storageService.initMultipartUpload("large_file.zip", 1024*1024*100);

// 分片上传(10个分片)
List<String> etags = new ArrayList<>();
for (int i=1; i<=10; i++) {
   
    String etag = storageService.uploadPart("large_file.zip", uploadId, 
        i, 1024*1024, getPartStream(i));
    etags.add(etag);
}

// 完成分片上传
storageService.completeMultipartUpload("large_file.zip", uploadId, etags);

系统优势总结

优势维度 实现方式
多服务兼容 通过StorageUtils动态加载存储服务实现类
配置灵活性 支持按存储类型+客户端名的组合方式创建桶
业务可扩展性 StorageService中集中实现业务增强逻辑
开发效率提升 提供FileOperateUtils简化常用操作

总结

该设计通过桥接模式实现了存储服务与业务逻辑的优雅分离,既保持了系统的扩展性,又通过工具类封装提升了开发效率。对于需要支持多云存储、复杂文件管理的业务场景,该架构提供了良好的可维护性和可演进性。

📌 本文档完整代码详见若依Geek仓库

相关文章
|
存储
若依框架 --- pdf文件上传预览功能实现
若依框架 --- pdf文件上传预览功能实现
1425 0
|
7月前
|
关系型数据库 Java 数据库连接
【RuoYi-SpringBoot3-Pro】:MyBatis-Plus 集成
RuoYi-SpringBoot3-Pro 集成 MyBatis-Plus 3.5.12,提供分页、乐观锁、多租户、Lambda 查询等核心功能,支持动态条件构建与代码生成,提升开发效率,助力企业级 SaaS 应用快速开发。
1335 0
|
存储 前端开发 Java
基于SpringBoot实现文件上传和下载(详细讲解And附完整代码)
基于SpringBoot实现文件上传和下载(详细讲解And附完整代码)
|
前端开发 数据库
两步教你ruoyi若依跳过前端拦截器变成自己的前端
如何通过修改前端配置和后端设置来跳过若依(RuoYi)前端的token验证,以便复用其前端框架并将其变成自己的前端。
 两步教你ruoyi若依跳过前端拦截器变成自己的前端
|
数据安全/隐私保护 网络架构
若依框架 -------- vue3+element-plus(一)
若依框架 -------- vue3+element-plus(一)
1242 1
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
2733 0
|
存储 前端开发 Java
如何使用 Spring 上传文件:全面指南
如何使用 Spring 上传文件:全面指南
1710 1
|
SQL XML Java
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
6331 0
|
API Java 监控
SpringBoot基于OpenAPI3的接口文档管理快速集成和使用
本文主要简单介绍SpringCloud2023中进行接口文档管理,方便前后端开发和文档维护。文档管理工具基于开源的knife4j封装的openapi3。
2226 3
|
SQL XML 关系型数据库
Mybatis-Plus通过SQL注入器实现真正的批量插入
Mybatis-Plus通过SQL注入器实现真正的批量插入
8553 0
Mybatis-Plus通过SQL注入器实现真正的批量插入

热门文章

最新文章