0


Spring File Storage(文件的对象存储)框架基本使用指南

概述

本文仅作为快速入门,深入学习及使用详见官网

云存储

在开发过程当中,会使用到存文档、图片、视频、音频等等,这些都会涉及存储的问题,文件可以直接存服务器,但需要考虑带宽和存储空间,另外一种方式就是使用云存储。目前主流的云存储有阿里云OSS、华为云OBS、七牛云Kodo、腾讯云COS、百度云 BOS、又拍云USS、MinIO 等。

X Spring File Storage 介绍

在 SpringBoot 中通过简单的方式将文件存储到 本地、FTP、SFTP、WebDAV、谷歌云存储、阿里云OSS、华为云OBS、七牛云Kodo、腾讯云COS、百度云 BOS、又拍云USS、MinIO、 AWS S3、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动云 EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的平台。

支持的平台如下图:

在这里插入图片描述

快速入门

添加依赖

  1. <dependencies><!-- spring-file-storage 必须要引入 --><dependency><groupId>cn.xuyanwu</groupId><artifactId>spring-file-storage</artifactId><version>2.1.0</version></dependency><!-- 华为云OBS 不使用的情况下可以不引入 --><dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java</artifactId><version>3.22.12</version></dependency><!-- 阿里云OSS 不使用的情况下可以不引入 --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.16.1</version></dependency>

添加配置文件

注:以下配置是 2.1.0 版本的配置

  1. dromara:x-file-storage:#文件存储配置default-platform: huawei-obs-1#默认使用的存储平台thumbnail-suffix:".min.jpg"#缩略图后缀,例如【.min.jpg】【.png】# 对应平台的配置写在这里,注意缩进要对齐huawei-obs:-platform: huawei-obs-1# 存储平台标识enable-storage:true# 启用存储。只有状态开启才会被识别到access-key:??secret-key:??end-point:??bucket-name:??domain:??# 访问域名,注意“/”结尾,例如:http://abc.obs.com/base-path: test/ # 基础路径# 本地存储(升级版)local-plus:-platform: local-plus-1# 存储平台标识enable-storage:true#启用存储enable-access:true#启用访问(线上请使用 Nginx 配置,效率更高)domain: http://127.0.0.1:8080/file/ # 访问域名,例如:“http://127.0.0.1:8030/file/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名base-path: local-plus/ # 基础路径path-patterns: /file/**# 访问路径storage-path: D:/Temp/ # 存储路径

编码

显式的开启文件上传功能

在启动类上加上

  1. @EnableFileStorage

注解

  1. @EnableFileStorage@SpringBootApplicationpublicclassSpringFileStorageTestApplication{publicstaticvoidmain(String[] args){SpringApplication.run(SpringFileStorageTestApplication.class,args);}}

上传

支持 File、MultipartFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大文件会自动分片上传。

  1. @RestControllerpublicclassFileDetailController{@AutowiredprivateFileStorageService fileStorageService;//注入实列/**
  2. * 上传文件
  3. */@PostMapping("/upload")publicFileInfoupload(MultipartFile file){return fileStorageService.of(file).upload();}/**
  4. * 上传文件,成功返回文件 url
  5. */@PostMapping("/upload2")publicStringupload2(MultipartFile file){FileInfo fileInfo = fileStorageService.of(file).setPath("upload/")//保存到相对路径下,为了方便管理,不需要可以不写.setObjectId("0")//关联对象id,为了方便管理,不需要可以不写.setObjectType("0")//关联对象类型,为了方便管理,不需要可以不写.putAttr("role","admin")//保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用,不需要可以不写.upload();//将文件上传到对应地方return fileInfo ==null?"上传失败!": fileInfo.getUrl();}/**
  6. * 上传图片,成功返回文件信息
  7. * 图片处理使用的是 https://github.com/coobird/thumbnailator
  8. */@PostMapping("/upload-image")publicFileInfouploadImage(MultipartFile file){return fileStorageService.of(file).image(img -> img.size(1000,1000))//将图片大小调整到 1000*1000.thumbnail(th -> th.size(200,200))//再生成一张 200*200 的缩略图.upload();}/**
  9. * 上传文件到指定存储平台,成功返回文件信息
  10. */@PostMapping("/upload-platform")publicFileInfouploadPlatform(MultipartFile file){return fileStorageService.of(file).setPlatform("aliyun-oss-1")//使用指定的存储平台.upload();}/**
  11. * 直接读取 HttpServletRequest 中的文件进行上传,成功返回文件信息
  12. * 使用这种方式有些注意事项,请查看文档 基础功能-上传 章节
  13. */@PostMapping("/upload-request")publicFileInfouploadPlatform(HttpServletRequest request){return fileStorageService.of(request).upload();}}

文件是否存在、下载、删除

  1. //手动构造文件信息,可用于其它操作FileInfo fileInfo =newFileInfo().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();// 下载到文件
  2. fileStorageService.download(fileInfo).file("C:\\a.jpg");// 下载缩略图
  3. fileStorageService.downloadTh(fileInfo).file("C:\\th.jpg");//删除
  4. 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();//删除
  5. fileStorageService.delete("https://abc.def.com/test/aa/image.png");

监听器

  1. // 下载文件 显示进度
  2. fileStorageService.download(fileInfo).setProgressMonitor(newProgressListener(){@Overridepublicvoidstart(){System.out.println("下载开始");}@Overridepublicvoidprogress(long progressSize,long allSize){System.out.println("已下载 "+ progressSize +" 总大小"+ allSize);}@Overridepublicvoidfinish(){System.out.println("下载结束");}}).file("C:\\a.jpg");

切面

工具还提供了每种操作的切面,可以在每个动作的前后进行干预,比如打日志,实现

  1. FileStorageAspect

类重写对应动作的 xxxAround 方法。

  1. /**
  2. * 使用切面打印文件上传和删除的日志
  3. */@Slf4j@ComponentpublicclassLogFileStorageAspectimplementsFileStorageAspect{/**
  4. * 上传,成功返回文件信息,失败返回 null
  5. */@OverridepublicFileInfouploadAround(UploadAspectChain chain,FileInfo fileInfo,UploadPretreatment pre,FileStorage fileStorage,FileRecorder fileRecorder){
  6. log.info("上传文件 before -> {}",fileInfo);
  7. fileInfo = chain.next(fileInfo,pre,fileStorage,fileRecorder);
  8. log.info("上传文件 after -> {}",fileInfo);return fileInfo;}}

表设计

  1. -- mysqlDROPTABLEIFEXISTS`file_detail`;CREATETABLE`file_detail`(`id`int(10)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'文件id',`url`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NOTNULLCOMMENT'文件访问地址',`size`bigint(20)NULLDEFAULTNULLCOMMENT'文件大小,单位字节',`filename`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'文件名称',`original_filename`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'原始文件名',`base_path`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'基础存储路径',`path`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'存储路径',`ext`varchar(32)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'文件扩展名',`content_type`varchar(32)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'MIME类型',`platform`varchar(32)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'存储平台',`th_url`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'缩略图访问路径',`th_filename`varchar(256)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'缩略图名称',`th_size`bigint(20)NULLDEFAULTNULLCOMMENT'缩略图大小,单位字节',`th_content_type`varchar(32)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'缩略图MIME类型',`object_id`varchar(32)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'文件所属对象id',`object_type`varchar(32)CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'文件所属对象类型,例如用户头像,评价图片',`attr`textCHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULLCOMMENT'附加属性',`create_time`datetime(0)NULLDEFAULTNULLCOMMENT'创建时间',PRIMARYKEY(`id`)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=1CHARACTERSET= utf8
  2. COLLATE= utf8_general_ci COMMENT='文件记录表'
  3. ROW_FORMAT = Dynamic;-- postgre 自定义createtableifnotexists"file_detail"(
  4. id VARCHAR(255)notnull,
  5. url VARCHAR(255)notnull,"size"BIGINTnull,
  6. filename VARCHAR(255)null,
  7. original_filename VARCHAR(255)null,
  8. base_path VARCHAR(255)null,"path"VARCHAR(255)null,
  9. ext VARCHAR(255)null,
  10. content_type VARCHAR(255)null,
  11. platform VARCHAR(255)null,
  12. th_url VARCHAR(255)null,
  13. th_filename VARCHAR(255)null,
  14. th_size bigintnull,
  15. th_content_type VARCHAR(255)null,
  16. object_id VARCHAR(255)null,
  17. object_type VARCHAR(255)null,
  18. attr VARCHAR(255)null,
  19. create_time TIMESTAMPnull,
  20. project_id UUID null,
  21. tenant_id UUID null,primarykey("id"));-- Column commentsCOMMENTONTABLE file_detail IS'文件记录表';COMMENTONCOLUMNpublic.file_detail.id IS'主键';COMMENTONCOLUMNpublic.file_detail.url IS'文件访问地址';COMMENTONCOLUMNpublic.file_detail."size"IS'文件大小,单位字节';COMMENTONCOLUMNpublic.file_detail.filename IS'文件名称';COMMENTONCOLUMNpublic.file_detail.original_filename IS'原始文件名';COMMENTONCOLUMNpublic.file_detail.base_path IS'基础存储路径';COMMENTONCOLUMNpublic.file_detail."path"IS'存储路径';COMMENTONCOLUMNpublic.file_detail.ext IS'文件扩展名';COMMENTONCOLUMNpublic.file_detail.content_type IS'MIME类型';COMMENTONCOLUMNpublic.file_detail.platform IS'存储平台';COMMENTONCOLUMNpublic.file_detail.th_url IS'缩略图访问路径';COMMENTONCOLUMNpublic.file_detail.th_filename IS'缩略图名称';COMMENTONCOLUMNpublic.file_detail.th_size IS'缩略图大小,单位字节';COMMENTONCOLUMNpublic.file_detail.th_content_type IS'缩略图MIME类型';COMMENTONCOLUMNpublic.file_detail.object_id IS'文件所属对象id';COMMENTONCOLUMNpublic.file_detail.object_type IS'文件所属对象类型,例如用户头像,评价图';COMMENTONCOLUMNpublic.file_detail.attr IS'附加属性';COMMENTONCOLUMNpublic.file_detail.create_time IS'创建时间';COMMENTONCOLUMNpublic.file_detail.project_id IS'项目id';COMMENTONCOLUMNpublic.file_detail.tenant_id IS'租户id';

参考

  • Springboot 中快速完成文件上传,整合多平台神器
标签: spring java filestorage

本文转载自: https://blog.csdn.net/footless_bird/article/details/140918164
版权归原作者 墨鸦_Cormorant 所有, 如有侵权,请联系我们删除。

“Spring File Storage(文件的对象存储)框架基本使用指南”的评论:

还没有评论