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

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文介绍基于桥接模式设计的文件上传模块,解耦存储服务与业务逻辑,支持多存储服务灵活适配,适用于单服务单存储桶及多服务多存储桶场景,提升系统扩展性与开发效率。

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仓库

相关文章
|
9天前
|
存储 人工智能 Serverless
函数计算进化之路:AI 应用运行时的状态剖析
AI应用正从“请求-响应”迈向“对话式智能体”,推动Serverless架构向“会话原生”演进。阿里云函数计算引领云上 AI 应用 Serverless 运行时技术创新,实现性能、隔离与成本平衡,开启Serverless AI新范式。
174 12
|
12天前
|
存储 编解码 监控
针对3-15分钟视频的抽帧策略:让Qwen2.5 VL 32B理解视频内容
针对3-15分钟视频,提出高效抽帧策略:通过每5-10秒定间隔或关键帧检测方法,提取30-100帧关键图像,结合时间均匀采样与运动变化捕捉,降低冗余,提升Qwen2.5 VL 32B对视频内容的理解效率与准确性。
|
20天前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
117 3
|
3天前
|
开发框架 JavaScript .NET
阿里云轻量应用服务器2核2G38元1年起怎么样?性能、应用场景与购买价值参考
目前在阿里云的活动中,抢购价为38元1年的轻量应用服务器受到了众多个人和中小企业用户的高度关注,该款轻量应用服务器置为2核CPU、2G内存,峰值带宽达200M。那么,此款轻量应用服务器的具体性能如何?适用于哪些应用场景?是否具备较高的购买价值?本文将针对这款特惠轻量应用服务器展开全面且深入的测评与介绍。
129 29
阿里云轻量应用服务器2核2G38元1年起怎么样?性能、应用场景与购买价值参考
|
5天前
|
并行计算 数据格式 异构计算
完整教程:从0到1在Windows下训练YOLOv8模型
本文详细介绍在Windows系统下使用YOLOv8训练目标检测模型的完整步骤,涵盖环境配置、数据集准备、模型训练与测试、常见问题解决及GPU加速技巧。提供详细命令与代码示例,并推荐现成数据集与工具,助您高效完成模型训练。
348 13
完整教程:从0到1在Windows下训练YOLOv8模型
|
5天前
|
监控 前端开发 搜索推荐
新手如何创建网站,网站建设6个阶段
本文系统解析网站建设流程,涵盖战略规划、技术选型、设计开发三大阶段,为不同用户提供实用指南。
114 24
|
5天前
|
机器学习/深度学习 分布式计算 Hadoop
summary.typeQuotaInfos.typeQuotaInfo[3].type
summary.typeQuotaInfos.typeQuotaInfo[3].type
98 19
|
4天前
|
机器学习/深度学习 人工智能 搜索推荐
当AI遇上癌症:聊聊个性化治疗的新可能
当AI遇上癌症:聊聊个性化治疗的新可能
56 15
|
8天前
|
人工智能 API Nacos
MCP Registry 官方发布:Nacos 原生支持,借助 HiMarket 构建企业级私有 MCP 市场
最近,MCP 社区发布了 MCP Registry(2025‑09‑08,预览版),为公开 MCP Server 提供“统一目录服务和开放 API”。Nacos 已原生支持 MCP Registry API,可直接作为“MCP Registry”对外提供标准 REST/OpenAPI 服务端,天然融入企业现有注册中心与配置治理体系,并与 Higress/HiMarket 对接打通,让企业能够高效的构建自己的私有 MCP 市场。
|
10天前
|
传感器 算法 数据挖掘
基于协方差交叉(CI)的多传感器融合算法matlab仿真,对比单传感器和SCC融合
基于协方差交叉(CI)的多传感器融合算法,通过MATLAB仿真对比单传感器、SCC与CI融合在位置/速度估计误差(RMSE)及等概率椭圆上的性能。采用MATLAB2022A实现,结果表明CI融合在未知相关性下仍具鲁棒性,有效降低估计误差。
108 15

热门文章

最新文章