一行代码搞定文件存储!这个万能通用的文件存储方案,太香了!

PHP开发者必备:5分钟搞定坚果云WebDAV接口对接(附完整代码) 本文为PHP开发者提供了快速对接坚果云WebDAV接口的完整指南。通过详细的步骤解析和附带的健壮客户端类代码,帮助开发者5分钟内实现文件上传、下载、列表管理等核心功能,轻松将云存储集成到内部系统或个人项目中。 阅读详情

市面上存在着各种文件存储平台,例如阿里云 OSS、腾讯云 COS、Amazon S3、MinIO、RustFS等。对接不同的文件存储平台需要使用不同的SDK,一旦切换平台代码改动非常麻烦。那么有没有一种万能通用的解决方案呢?今天给大家分享一款通用的文件存储解决方案x-file-storage,能一行代码搞定文件存储!

简介

x-file-storage是一款通用的文件存储解决方案,能一行代码将实现文件存储,目前在Github上已有2k+Star。对接不同存储平台时,只需添加对应平台的SDK依赖即可,使用方法完全一致。

对于主流的存储平台,x-file-storage基本都支持,具体支持平台如下:

使用

这里以兼容Amazon S3 V2的RustFS和MinIO为例,来讲解下x-file-storage的使用。

RustFS

RustFS是兼容Amazon S3 V2的对象存储平台,我们可以直接按Amazon S3 V2的方式实现文件存储。

  • 这里以Docker环境下RustFS的运行为例,运行命令如下;
docker run -p 9000:9000 --name rustfs \
-e RUSTFS_ACCESS_KEY=rustfsadmin \
-e RUSTFS_SECRET_KEY=rustfsadmin \
-v /mydata/rustfs/data:/data \
-v /etc/localtime:/etc/localtime \
-d rustfs/rustfs
  • 运行成功后登录RustFS的控制台,创建一个叫simple的Bucket,控制台访问地址:http://192.168.3.101:9000

  • 接下来创建一个SpringBoot项目,在pom.xml中添加x-file-storage和Amazon S3 V2的相关依赖;
<!--x-file-storage相关依赖-->
<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>${x-file-storage.version}</version>
</dependency>
<!--AWS S3 Java SDK相关依赖-->
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>${aws-s3-sdk.version}</version>
</dependency>
  • 然后在application.yml配置中添加amazon-s3-v2相关连接配置;
dromara:
  x-file-storage:
    default-platform: amazon-s3-v2-1
    amazon-s3-v2: # Amazon S3 V2
      - platform: amazon-s3-v2-1 # 存储平台标识
        enable-storage: true  # 启用存储
        access-key: rustfsadmin
        secret-key: rustfsadmin
        region: ap-east-1 # 必填
        end-point: http://192.168.3.101:9000 # 必填
        bucket-name: simple #桶名称
        domain: http://192.168.3.101:9000/ # 访问域名
  • 之后在启动类上添加@EnableFileStorage来启用文件存储功能;
@EnableFileStorage
@SpringBootApplication
public class SpringFileStorageApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringFileStorageApplication.class, args);
    }
}
  • 然后创建Controller,通过注入的FileStorageService中的方法,一行代码即可实现文件上传和删除操作!
/**
 * @auther macrozheng
 * @description x-file-storage文件存储存储管理Controller
 * @date 2025/7/24
 * @github https://github.com/macrozheng
 */
@Controller
@Tag(name = "FileStorageController", description = "x-file-storage文件存储存储管理")
@RequestMapping("/storage")
public class FileStorageController {

    @Autowired
    private FileStorageService fileStorageService;//注入实列

    @Operation(summary = "文件上传")
    @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    public CommonResult<FileStorageResult> upload(@RequestPart("file") MultipartFile file) {
        FileInfo fileInfo = fileStorageService.of(file).upload();
        FileStorageResult result = new FileStorageResult();
        result.setName(fileInfo.getFilename());
        result.setUrl(fileInfo.getUrl());
        return CommonResult.success(result);
    }

    @Operation(summary = "文件删除")
    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult delete(@RequestParam("objectName") String objectName) {
        FileInfo fileInfo = new FileInfo().setFilename(objectName).setPlatform("amazon-s3-v2-1");
        fileStorageService.delete(fileInfo);
        return CommonResult.success(null);
    }
}

这或许是一个对你有用的开源项目,mall项目是一套基于SpringBoot3 + Vue 的电商系统(Github标星60K),后端支持多模块和2024最新微服务架构,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!

Boot项目:github.com/macrozheng/… Cloud项目:github.com/macrozheng/… 教程网站:www.macrozheng.com

项目演示:

MinIO

  • 这里以Docker环境下MinIO的运行为例,运行命令如下;
docker run -p 9090:9000 -p 9001:9001 --name minio \
-v /mydata/minio/data:/data \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
-d minio/minio server /data --console-address ":9001"
  • 运行成功后登录MinIO的控制台,创建一个叫simple的Bucket,控制台访问地址:http://192.168.3.101:9001

  • 在pom.xml中再添加MinIO的相关依赖;
<!--MinIO相关依赖-->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>${minio-sdk.version}</version>
</dependency>
  • 然后在application.yml配置中添加minio相关连接配置;
dromara:
  x-file-storage:
    minio:
      - platform: minio-1 # 存储平台标识
        enable-storage: true  # 启用存储
        access-key: minioadmin
        secret-key: minioadmin
        end-point: http://192.168.3.101:9090
        bucket-name: simple
        domain: http://192.168.3.101:9090/ # 访问域名
  • 然后在Controller中添加MinIO的文件上传和删除接口,和之前的代码对比,只需用setPlatform设置上传平台为minio-1即可。
/**
 * @auther macrozheng
 * @description x-file-storage文件存储存储管理Controller
 * @date 2025/7/24
 * @github https://github.com/macrozheng
 */
@Controller
@Tag(name = "FileStorageController", description = "x-file-storage文件存储存储管理")
@RequestMapping("/storage")
public class FileStorageController {

    @Autowired
    private FileStorageService fileStorageService;//注入实列

    @Operation(summary = "文件上传")
    @RequestMapping(value = "/upload-minio", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    public CommonResult<FileStorageResult> uploadMinIO(@RequestPart("file") MultipartFile file) {
        FileInfo fileInfo = fileStorageService.of(file).setPlatform("minio-1").upload();
        FileStorageResult result = new FileStorageResult();
        result.setName(fileInfo.getFilename());
        result.setUrl(fileInfo.getUrl());
        return CommonResult.success(result);
    }

    @Operation(summary = "文件删除")
    @RequestMapping(value = "/delete-minio", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult deleteMinio(@RequestParam("objectName") String objectName) {
        FileInfo fileInfo = new FileInfo().setFilename(objectName).setPlatform("minio-1");
        fileStorageService.delete(fileInfo);
        return CommonResult.success(null);
    }
}

测试

  • 代码编写完毕后将项目给运行起来,运行成功后可通过Swagger文档测试接口,访问地址:http://localhost:8088/swagger-ui/index.html

  • 首先我们来调用下RustFS的文件上传接口;

  • 上传成功后即可在RustFS的控制台中查看到对应的文件了;

  • 再调用下MinIO的文件上传接口;

  • 上传成功后在MinIO的控制台中同样可以查看到对应的文件。

总结

今天给大家分享了下x-file-storage的使用,对于不同的存储平台,它的用法基本上是一致的,有了它我们就可以轻松切换到不同的存储平台了,感兴趣的小伙伴可以尝试下!

项目地址

github.com/dromara/x-f…

项目源码地址

github.com/macrozheng/…

一站式文件存储 X File Storage 发布2.1.0版本,新增 FastDFS、Azure Blob 存储平台,复制移动文件,手动分片上传 一站式文件存储,聚合对接所有主流存储平台。新增FastDFS、Azure Blob存储平台,复制移动文件,手动分片上传,计算哈希等功能,优化大量功能,修复已知BUG 阅读详情

相关推荐

若依前后端分离版集成x-file-storage插件实现文件上传(以华为云obs为例)

问题原因:因spring-boot约定了三方依赖的版本,在spring-boot框架中引入OBS SDK时,会将SDK所指定的三方依赖okhttp3的版本由4.8.0降至3.14.9,导致无法获取到指定方法。可以通过使用集成了三方依赖的bundle版SDK来进行规避,或在您的项目中显示的引用 4.8.0 版本的okhttp3。③ 在ruoyi-admin中的controller包下的commonController中修改通用上传代码,如下图所示。在ruoyi-admin中引入对应存储平台的sdk。

weixin_64878779的博客 2036

spring boot实现大文件上传【分片上传】插件(x-file-storage),同时支持本地、FTP、SFTP、阿里云 OSS、腾讯云 COS、MinIO、 Amazon S3等

个人建议 还是分开写两个接口好,如果后续需要做暂停 ,取消上传 、继续上传 应该都需要FileInfo 这个对象里的数据。目前我的需求里 还没涉及到 暂停 ,取消上传 、继续上传 但是我以我看到这个依赖的源码 我觉得是后续扩展这些功能。插件(x-file-storage) 具体这个插件怎么使用 简单的文件上传 看下面的这篇博客 有详细说明。先判断redis 存在不 不存在就初始化 存在 就直接分片上传,上传完成后,再把redis里的数据删除!先给大家 看一下插件源码里 提供的分片上传的 demo。

Json的知识梦工厂 4503

win11系统搭建FTP服务器超详细流程

win11系统搭建FTP服务器超详细流程

weixin_67212002的博客 2569

x-file-storage---一行代码将文件存储到本地

找到ruoyi-admin模块中的com.ruoyi.web.controller.common.,修改单个文件上传的方法。

yyycccii的博客 1808

从MinIO切到RustFS的血泪教训:我们踩过的5个坑及解决方案

本文分享了从MinIO迁移到RustFS过程中遇到的五个核心挑战与解决方案,重点涵盖元数据丢失、权限继承、特殊文件处理、客户端兼容性及回滚预案。通过对比rclone与mc等工具,提供了详细的元数据迁移策略和验证脚本,旨在为面临类似数据迁移的团队提供实用的避坑指南。

h6j7k8l9p0的博客 499

5分钟搞定kkFileView Docker部署:解决字体乱码与预览慢的实战技巧

本文提供了一份详细的kkFileView Docker部署实战指南,重点解决字体乱码与预览慢两大核心问题。通过构建包含中文字体的自定义镜像、启用并优化缓存配置、利用队列预热等技巧,帮助开发者在5分钟内快速搭建稳定高效的文档在线预览服务,适用于生产环境集成。

weixin_28834169的博客 318

一行代码集成20+存储平台:x-file-storage彻底终结文件存储碎片化

企业级应用开发中,文件存储始终是绕不开的痛点: - 本地存储难以扩展,分布式部署时文件同步困难 - 云厂商API差异巨大,切换平台需重写大量代码 - 多平台存储导致数据碎片化,管理维护成本激增 - 大文件上传、断点续传、跨平台迁移等场景实现复杂 **x-file-storage** 作为Dromara开源组织旗下的明星项目,以"**一行代码连接所有存储**"为核心理念,彻底解决了这些难题。本文将

gitblog_01403的博客 931

前端实战:零成本实现Word、Excel、PPT、PDF在线预览方案

本文详细介绍了前端实现Word、Excel、PPT、PDF文档在线预览的多种零成本方案。针对不同格式,分别探讨了微软官方Office在线预览服务、浏览器原生PDF标签、pdf.js深度定制以及纯前端解析库(如docx-preview、SheetJS)的实战应用。文章重点分析了各方案的优势、限制与适用场景,并提供了企业级项目的架构建议与性能优化指南,帮助开发者根据业务需求选择最佳实现路径。

xgboost6farmer的博客 431

若依框架整合x-file-storage实现多云存储适配(华为云OBS与阿里云OSS双案例)

本文详细介绍了如何在若依框架中集成x-file-storage组件,实现文件上传功能与底层存储服务的解耦。通过华为云OBS与阿里云OSS双案例实战,演示了如何通过统一接口适配多云存储,仅需修改配置即可灵活切换,极大提升了系统的可维护性与扩展性。

weixin_28432777的博客 447

干云这一行的,谁还不懂点“基础设施即代码”?——聊聊云计算基础设施的管理真经

摘要: 云计算基础设施管理并非“甩锅”给云厂商,而是需要更精细化的运维策略。核心在于基础设施即代码(IaC),通过Terraform等工具实现自动化部署,同时结合监控(如Prometheus)和配置管理工具(如Ansible)确保稳定性。权限与安全需从源头把控,遵循最小权限原则。云时代运维的本质是将重复劳动代码化、状态可视化、权限流程化,最终实现稳定、高效、可控的系统管理。运维人需从“被动执行”转向“自动化设计”,才能真正驾驭云环境。

Echo_Wish 138

金蝶云星空-协同开发云-安装开发环境

金蝶协同开发云就是不需要每一个开发都在自己的本机安装开发环境,自己安装可容易出错,包括源代码管理也一并解决了,大大减少了开发人员的工作量和降低了上手的难度。

qq_33881408的博客 5600

即开即用的老牌万能视频转码神器,极空间部署免费开源的『HandBrake』

这个项目说实话还是非常良心的,功能丰富且强大,并且很多小伙伴其实也都用的上。不过需要说明的是,考虑到此项目在工作的时候主要依靠处理器的性能,所以并不太建议大家使用NAS来实现长时间的转码操作,毕竟NAS也不太适合长时间高负荷的工作,不过偶尔使用,或者只是对一些小视频处理倒是没有什么问题的。如果说你真的对视频转码有刚需,则是建议大家直接在电脑上使用它的客户端,毕竟电脑的硬件配置还是比NAS高出很多,在转码方面的效率自然也高很多。

qq_63499861的博客 3001

rk3576 点亮 LCD(mipi)

瑞芯微 RK3576 是一款面向中高端 AIoT 市场的 SoC,其 MIPI DSI (Display Serial Interface) 接口在性能和灵活性上相比前代(如 RK3399/RK3568)有显著提升,特别是在物理层协议的支持上更加现代化。相比RK3399 RK3568的mipi 接口少了 8lane,但是RK3576 MIPI DSI 增加更低功耗的 C-PHY。

weixin_35723192的博客 364

解锁企业数字转型新密码:JNPF低代码让业务“活”起来

以请假流程为例,员工提交请假申请后,系统会按照预设的流程,自动将申请推送给上级领导进行审批,审批通过后,相关部门和人员也会及时收到通知,整个过程高效流畅,大大减少了人为操作的繁琐与延误,提高了工作效率,确保业务流程的顺畅无阻。一方面,企业数字化转型的需求犹如箭在弦上,不得不发。并且,在后续的运营过程中,一旦发现市场需求有新的变化,或是竞争对手推出了新的功能,业务人员无需依赖专业开发人员,自己就能通过平台快速调整页面布局、添加新的促销活动模块,实现应用的快速迭代,始终让业务走在市场前沿。

dsgdauigfs的博客 1515

【定位模块算法】amcl(蒙特卡洛)粒子滤波定位算法(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言(1)amcl定位框架介绍(2)amcl定位框架组成(1)ROS-TF坐标转换树【ROS的工具】(2)robot_pose_ekf扩展卡尔曼位姿估计算法(3)定位amcl自适应蒙特卡洛定位,adaptive monte carlo localizaion**(3)amcl定位节点的订阅与发布(4)amcl定位功能包用法(1)编写amcl节点相关的launch(amcl_omni.l

qq_35635374的博客 4403

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

File-Based架构:为什么MVP阶段文件存储是最优解?

在应用开发的早期阶段,数据存储方案的选择往往决定产品迭代速度。文件存储作为最基础的数据持久化方式,凭借其简单透明的特性,成为MVP(最小可行产品)验证需求的理想选择。其核心原理是将业务数据以JSON、CSV等格式直接写入设备文件系统,无需额外数据库服务,从而大幅降低开发、调试与运维成本。SQLite等嵌入式数据库本质上也是单文件存储,但裸文件方案在轻量级场景下更具优势。本文从File-Based架构的底层逻辑出发,分析其适用边界,并通过任务管理App实例展示基于JSON文件的工程落地,包括原子写、并发控制与

weixin_42665255的博客 306

SAP Fiori Launchpad 概述

SAP Fiori launchpad 是托管 SAP Fiori 应用程序的 shell,并为应用程序提供导航、个性化、嵌入式支持和应用程序配置等服务。SAP Fiori Launchpad 是移动和桌面设备上 SAP Fiori 应用程序的入口点。启动板显示带有图块的主页,其中可以显示实时状态指示器,例如打开的任务数量。每个图块代表用户可以启动的业务应用程序。这包括 SAP Business Suite 事务应用程序和 SAP Smart Business 分析应用程序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 933

什么软件可以翻译文档

而且,在这个工作台中,还有一个非常神奇的文档翻译功能。无论你的文档来源于哪个国家,哪种语言,只需要点击一下,它就能帮你快速将整篇文章自动翻译成汉语或英语,让你轻松搞定跨语言翻译的难题!这款软件非常厉害,它能够翻译很多国家的语言,也可以支持不同格式的文件的翻译,你无需先将文件进行格式转换再拿去翻译。它的文档翻译功能可以支持doc、docx、pdf、pptx等文件的翻译,并且又快又准,还能批量操作,大大提高你的工作学习效率,节约很多时间。翻译文档是指将一种语言的文档或文件,转换成另一种语言的过程。

LuLaaa_的博客 102

【WRF-Urban】Registry.EM_COMMON文件概述及urban有关变量

Registry.EM_COMMON文件概述及urban有关变量

WW、forever的博客 1595

【YOLO】Mask Proto分支理解

Mask Proto分支通过解耦全局原型与实例参数,在保持YOLO实时性的同时实现精准分割。其技术核心在于利用多尺度特征生成可组合的原型,结合动态系数适应不同目标形态。未来可进一步融合Transformer的注意力机制,增强对复杂场景的建模能力。

浩瀚之水的专栏 477

开发说不做的小需求,业务人员用 TDuckX 搞定

在做企业应用或者内部工具时,有一个老大难的问题:业务人员经常会说:“我想临时加个调研表单。”“能不能帮我做个报名通道?这些需求都不算大,但放到研发排期里,就很容易被压后。等真正上线时,时机可能已经错过了。我自己在项目里踩过不少坑,后来接触了,才发现它能解决不少痛点。

马哥的博客 496

「UG/NX」多功能dll集成一个dll的三种方法

C++多功能集成一个dll的三种方法。

何曾参静谧的博客 1390

通用架构设计:复杂业务系统的分层、模块化与演进之道

复杂业务系统的核心挑战往往不在技术本身,而在于业务规则之间的相互纠缠。技术复杂度可通过成熟方案解决,业务复杂度却需要从领域模型、模块边界和依赖关系入手。通用架构设计的本质并非堆砌新技术,而是通过分层架构、高内聚低耦合的模块划分,以及演进式可扩展策略,构建一套稳定且能适应需求变化的骨架。实践中,领域建模厘清核心概念,权限与流程引擎作为通用支撑能力,状态机与接口幂等保障关键环节的可靠性,而分布式事务则需优先通过领域设计规避强一致需求。这套方法论可应用于订单、库存、合同、审批等典型企业级场景,有效控制系统复杂度,

weixin_32612263的博客 207

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

5分钟轻松搞定B站视频本地保存:BilibiliDown跨平台下载工具终极指南

你是否曾经遇到过这样的烦恼?看到一段精彩的B站教学视频想保存下来反复学习,却发现网络环境不稳定导致下载中断;收藏夹里积累了数百个优质内容,想要一次性下载整理却找不到合适的工具;或者只是想离线观看喜欢的UP主视频,却受限于平台的各种限制?今天,我要向你介绍一款能完美解决这些问题的开源神器——BilibiliDown!这是一款专为B站用户设计的跨平台视频下载工具,让你轻松将喜欢的视频保存到本地,支持W

gitblog_01199的博客 432

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 告别Swagger UI!一款更适合Spring Boot的API文档新选择!
下一篇: 实现大文件上传全流程详解(补偿版本)
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值