一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS、MinIO、 Amazon S3、Amazon S3 V2、GoogleCloud Storage、FastDFS、 Azure Blob Storage、Mongo GridFS、Mongo GridFS、go-fastdfs、 火山引擎 TOS、Cloudflare R2、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动 云EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的存储平台。
X-File-Storage(原名 X Spring File Storage)是一个基于 Java 的开源文件存储中间件,目前已捐赠至 Dromara 开源组织。该项目允许开发者通过一行代码将文件存储到各种存储平台中,极大地简化了文件上传、下载和管理的复杂性。
官方文档:https://x-file-storage.xuyanwu.cn/#/
GIT: https://gitee.com/dromara/x-file-storage
在传统的应用开发中,文件存储往往需要针对不同的存储平台编写不同的代码,当需要更换存储方式时,经常面临大量重构工作。X-File-Storage 通过统一的 API 接口,解决了这一痛点,让开发者能够:
X-File-Storage 支持几乎所有主流的存储平台,包括但不限于:
特别值得一提的是,通过 WebDAV 连接到 Alist 后,还可以间接使用百度网盘、天翼云盘、阿里云盘、迅雷网盘等常见存储服务,大大扩展了其应用范围。
X-File-Storage 支持 Spring Boot 环境,也需要 JDK 8+ 。
在 pom.xml 中引入相关依赖,这里以阿里云 OSS 为例:
xml <!-- 引入 X-File-Storage --> <dependency> <groupId>org.dromara.x-file-storage</groupId> <artifactId>x-file-storage-spring</artifactId> <version>2.3.0</version> </dependency> <!-- 引入 阿里云 OSS SDK,如果使用其它存储平台,就引入对应的 SDK --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.16.1</version> </dependency>
在 application.yml 配置文件中添加存储平台的配置信息:
yaml dromara: x-file-storage: #文件存储配置 default-platform: aliyun-oss-1 #默认使用的存储平台 aliyun-oss: - platform: aliyun-oss-1 # 存储平台标识 enable-storage: true # 启用存储 access-key: ?? # 替换为你的 access-key secret-key: ?? # 替换为你的 secret-key end-point: ?? # 替换为你的 end-point bucket-name: ?? # 替换为你的 bucket-name domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/ base-path: test/ # 基础路径
在 Spring Boot 启动类上添加 @EnableFileStorage 注解:
java @EnableFileStorage @SpringBootApplication public class SpringFileStorageTestApplication { public static void main(String[] args) { SpringApplication.run(SpringFileStorageTestApplication.class,args); } }
在 Controller 中注入并使用 FileStorageService:
java @RestController public class FileDetailController { @Autowired private FileStorageService fileStorageService; /** * 上传文件 */ @PostMapping("/upload") public FileInfo upload(MultipartFile file) { // 只需要这一行代码即可上传成功 return fileStorageService.of(file).setPath(LocalDate.now() + StrUtil.SLASH).upload(); } }
X-File-Storage 提供了丰富的上传选项,满足各种业务场景需求:
java /** * 上传文件,成功返回文件 url */ @PostMapping("/upload2") public String upload2(MultipartFile file) { FileInfo fileInfo = fileStorageService.of(file) .setPath("upload/") // 保存到相对路径下,为了方便管理,不需要可以不写 .setObjectId("0") // 关联对象id,为了方便管理,不需要可以不写 .setObjectType("0") // 关联对象类型,为了方便管理,不需要可以不写 .putAttr("role","admin") // 保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用 .upload(); // 将文件上传到对应地方 return fileInfo == null ? "上传失败!" : fileInfo.getUrl(); }
X-File-Storage 内置了图片处理功能,基于 thumbnailator 库,可以轻松处理图片和生成缩略图:
java /** * 上传图片,成功返回文件信息 */ @PostMapping("/upload-image") public FileInfo uploadImage(MultipartFile file) { return fileStorageService.of(file) .image(img -> img.size(1000,1000)) // 将图片大小调整到 1000*1000 .thumbnail(th -> th.size(200,200)) // 再生成一张 200*200 的缩略图 .upload(); }
如果需要将文件上传到特定的存储平台,可以明确指定平台标识:
java /** * 上传文件到指定存储平台,成功返回文件信息 */ @PostMapping("/upload-platform") public FileInfo uploadPlatform(MultipartFile file) { return fileStorageService.of(file) .setPlatform("aliyun-oss-1") // 使用指定的存储平台 .upload(); }
对于大文件或特殊场景,X-File-Storage 提供了更多高级功能:
java /** * 直接读取 HttpServletRequest 中的文件进行上传 * 可以实现文件不落盘,边读取边上传,速度更快 */ @PostMapping("/upload-request") public FileInfo uploadRequest(HttpServletRequest request) { return fileStorageService.of(request).upload(); }
使用此功能需要在配置文件中开启 multipart 懒加载:
yaml spring: servlet: multipart: max-file-size: 10MB # 文件大小限制 max-request-size: 100MB # 请求大小限制 resolve-lazily: true # 开启懒加载
X-File-Storage 不仅支持文件上传,还提供了一套完整的文件管理功能:
java // 根据 URL 获取文件信息 FileInfo fileInfo = fileStorageService.getFileInfoByUrl("https://abc.def.com/test/aa/image.png"); // 检查文件是否存在 boolean exists = fileStorageService.exists("https://abc.def.com/test/aa/image.png"); // 下载文件 byte[] bytes = fileStorageService.download("https://abc.def.com/test/aa/image.png").bytes(); // 删除文件 fileStorageService.delete("https://abc.def.com/test/aa/image.png");
通过实现 FileRecorder 接口,可以将文件信息保存到数据库中,方便后续管理和检索。官方推荐的数据库表结构如下:
sql CREATE TABLE `file_detail` ( `id` varchar(32) NOT NULL COMMENT '文件id', `url` varchar(512) NOT NULL COMMENT '文件访问地址', `size` bigint(20) DEFAULT NULL COMMENT '文件大小,单位字节', `filename` varchar(256) DEFAULT NULL COMMENT '文件名称', `original_filename` varchar(256) DEFAULT NULL COMMENT '原始文件名', `base_path` varchar(256) DEFAULT NULL COMMENT '基础存储路径', `path` varchar(256) DEFAULT NULL COMMENT '存储路径', `ext` varchar(32) DEFAULT NULL COMMENT '文件扩展名', `content_type` varchar(128) DEFAULT NULL COMMENT 'MIME类型', `platform` varchar(32) DEFAULT NULL COMMENT '存储平台', `th_url` varchar(512) DEFAULT NULL COMMENT '缩略图访问路径', `th_filename` varchar(256) DEFAULT NULL COMMENT '缩略图名称', `th_size` bigint(20) DEFAULT NULL COMMENT '缩略图大小,单位字节', `th_content_type` varchar(128) DEFAULT NULL COMMENT '缩略图MIME类型', `object_id` varchar(32) DEFAULT NULL COMMENT '文件所属对象id', -- 其他字段... )
X-File-Storage 支持在不同存储平台之间迁移文件,当业务需要更换存储服务商时,这一功能显得尤为实用。
X-File-Storage 采用高度模块化的设计,核心特性包括:
除了 Spring Boot,X-File-Storage 还提供了对 Solon 框架的支持,并可以脱离 Spring Boot 单独使用,展现了其良好的框架适应性。
X-File-Storage 适用于多种业务场景:
在实际生产环境中,建议考虑以下方面:
X-File-Storage 2.3.0 作为一个功能全面的文件存储中间件,通过简化的 API 设计和广泛存储平台支持,极大地降低了Java开发者在文件存储方面的复杂度。其主要优势包括:
对于正在寻找文件存储解决方案的Java开发者,X-File-Storage 无疑是一个值得尝试的选择,它能显著提升开发效率,让开发者更专注于核心业务逻辑的实现。
本文作者:张豪
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!