![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-cf0d92129138e2c138e143696168013a.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-9ed8adde419af49b394e0d0b88921cd6.jpg)
原名 X Spring File Storage 现已捐赠至 dromara 开源组织
x-file-storage.dromara.org | x-file-storage.xuyanwu.cn | spring-file-storage.xuyanwu.cn
📚简介
一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS、MinIO、 Amazon S3、GoogleCloud Storage、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动 云EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的存储平台。查看 所有支持的存储平台
💡 通过 WebDAV 连接到 Alist 后,可以使用百度网盘、天翼云盘、阿里云盘、迅雷网盘等常见存储服务,查看 Alist 支持的存储平台
GitHub:github.com/dromara/x-f…
Gitee:gitee.com/dromara/x-f…
文档1:x-file-storage.dromara.org
文档2:x-file-storage.xuyanwu.cn
文档3:spring-file-storage.xuyanwu.cn
📜更新内容
- 更改项目名、更改包名、优化项目结构
- 新增直接读取 HttpServletRequest 的流进行上传,文件不落盘,速度更快
- 新增支持 Metadata 元数据
- 优化 ACL 异常处理
- 优化文件删除逻辑
- 修复 Amazon S3 上传文件偶现 ResetException 问题
- 捐赠至 dromara 开源社区
项目依赖的变化
2.0.0 之前的版本
cn.xuyanwu
spring-file-storage
1.0.3
2.0.0 及以后的版本
org.dromara.x-file-storage
x-file-storage-spring
2.0.0
配置参数的变化
2.0.0 之前的版本
spring:
file-storage: #文件存储配置
default-platform: huawei-obs-1 #默认使用的存储平台
thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
#对应平台的配置写在这里,注意缩进要对齐
2.0.0 及以后的版本
dromara:
x-file-storage: #文件存储配置
default-platform: huawei-obs-1 #默认使用的存储平台
thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
#对应平台的配置写在这里,注意缩进要对齐
包名的变化
2.0.0 之前的版本
cn.xuyanwu.spring.file.storage
cn.xuyanwu.spring.file.storage.spring
2.0.0 及以后的版本
org.dromara.x.file.storage.core
org.dromara.x.file.storage.spring
📦使用
点击 快速入门 查看全部存储平台的使用方法!
🔧 配置
这里以阿里云 OSS 为例,pom.xml
引入本项目,这里默认是 SpringBoot
环境,其它环境参考 脱离 SpringBoot 单独使用
org.dromara.x-file-storage
x-file-storage-spring
2.0.0
com.aliyun.oss
aliyun-sdk-oss
3.16.1
application.yml
配置文件中添加以下基础配置
dromara:
x-file-storage: #文件存储配置
default-platform: aliyun-oss-1 #默认使用的存储平台
aliyun-oss:
- platform: aliyun-oss-1 # 存储平台标识
enable-storage: true # 启用存储
access-key: ??
secret-key: ??
end-point: ??
bucket-name: ??
domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
base-path: test/ # 基础路径
🔨编码
在启动类上加上@EnableFileStorage
注解
@EnableFileStorage
@SpringBootApplication
public class SpringFileStorageTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringFileStorageTestApplication.class,args);
}
}
✨开始上传
支持 File、MultipartFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大文件会自动分片上传。如果想支持更多方式,请阅读 文件适配器 章节
@RestController
public class FileDetailController {
@Autowired
private FileStorageService fileStorageService;//注入实列
/**
* 上传文件
*/
@PostMapping("/upload")
public FileInfo upload(MultipartFile file) {
//只需要这一行代码即可上传成功
return fileStorageService.of(file).upload();
}
/**
* 上传文件,成功返回文件 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();
}
/**
* 上传图片,成功返回文件信息
* 图片处理使用的是 https://github.com/coobird/thumbnailator
*/
@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();
}
/**
* 上传文件到指定存储平台,成功返回文件信息
*/
@PostMapping("/upload-platform")
public FileInfo uploadPlatform(MultipartFile file) {
return fileStorageService.of(file)
.setPlatform("aliyun-oss-1") //使用指定的存储平台
.upload();
}
/**
* 直接读取 HttpServletRequest 中的文件进行上传,成功返回文件信息
* 使用这种方式有些注意事项,请查看文档 基础功能-上传 章节
*/
@PostMapping("/upload-request")
public FileInfo uploadPlatform(HttpServletRequest request) {
return fileStorageService.of(request).upload();
}
}
🎨其它操作
//手动构造文件信息,可用于其它操作
FileInfo fileInfo = new FileInfo()
.setPlatform("huawei-obs-1")
.setBasePath("test/")
.setPath("aa/")
.setFilename("image.png")
.setThFilename("image.png.min.jpg");
//文件是否存在
boolean exists = fileStorageService.exists(fileInfo);
//下载
byte[] bytes = fileStorageService.download(fileInfo).bytes();
//删除
fileStorageService.delete(fileInfo);
//其它更多操作
如果将文件记录保存到数据库中,还可以更方便的根据 URL 进行操作了,详情请阅读 保存上传记录 章节
//直接从数据库中获取 FileInfo 对象,更加方便执行其它操作
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");
//其它更多操作
点击 快速入门 查看全部存储平台的使用方法!
🚀Dromara成员项目
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-b45b2f4d47be79f0e82c8da1de7323c8.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-4af5fc70df046fbc5a70baf2a3b2dad5.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-d596bb1ff61e26d46ac66eab4b3677ee.jpg)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-896b69aba0b883a93340e15578b242d2.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-910860768fc6a7523cf9a93a42c37abe.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-196cc4ab38b939e598aa7fa3b906f31b.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-4d91030065712e1f5a533c2b49bb1892.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-c45c6f07ce576863cb6474b4e64e1e2d.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-11089feabe45bfaf9ffdedd7be202af5.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-93b6a5cb45562ad7508c4c98dde4f6d7.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-133b580f6c4ae43494334a4586fa8614.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-6d02c029c6d137dfd13e7404ece8d59f.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-7621fa9f7c82779188ce0c0fca0543c0.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-e5bd5d163080ef887106c76381962499.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-3a1e8f90ae01525f5bc40e224fed7991.jpg)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-c7cafab6a35dc1d268017bc94106e218.gif)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-6060a4ff7a6dd38f7bd2c8ec1f7e9df4.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-b2afbd7b3fe8cc3c79642fbb820318c8.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-79aa212b9bbfb07caaff5993bb1e025d.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-10444c066694a0527ea68d5b076eb49f.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-9c358c6064bee91235aede3e398d45c8.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-d2dc16edb9754258fff56cc90d9592fd.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-3bb723b96393b48154002ac8b307ffae.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-2d71b050582f3ea672468071de978344.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-61d2a1c5c9b012221601d964f0dd6d23.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-787f4ec5c465e70e31fccd0eaa0d36fb.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-165d563de72ac949a8d9116b5ec92e77.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-76419bd8135716f1ef0ba3b765bd85e9.jpg)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-805add9e1520722e9d8d0446d67f3cb5.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-e7e2e311c224ed49be22a947fa87b8a0.jpg)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-63c2646a2f53c20f59491f808218c58a.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-3f17f5f5b79935671a4b7f6e53b94108.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-8b1430f9caa08442605f9704deb4ce6c.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-54bbaf97ad10e7f2240ba376b832408c.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-c479668a8ef99da17d4961a9db831dc6.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-cae610283f00aa34ae8870588d8c424e.jpg)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-19effe065ab6a48edf039c89f8e08d5f.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-6f548a48695d2ea1e4a0f432c4eb69cb.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-d3b39d4773de363fb6d2f48dd2c9b81d.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-4060b1725835e15d8e2208699c431dc8.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-1e9989b5ee7b4c5bcfa4e66c24278db1.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-5d9506807bd4a2bb4a16e1872e22b448.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-ff5c2cdc572a06cf9c25ee3bad4c1186.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-4aac4487122355f8104a51b09f441f9e.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-4e01eec6373d578fa85599d4a4d5f1ca.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-2895175a5dab9e5091e37a2ca62b283c.png)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-cc4de7f4c6cb8c86cb0fddbec59ab96b.jpg)
![](http://www.e1idc.com/wp-content/uploads/2023/10/frc-864381ba6e61f4dfd247ab8c4c699998.png)
为往圣继绝学,一个人或许能走的更快,但一群人会走的更远。