XSpringFileStorage整合oss集成和测试存储服务
-
XSpringFileStorage简介
- 在 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 协议的平台
- 官方文档:https://spring-file-storage.xuyanwu.cn/#/
- gitee地址 :https://gitee.com/XYW1171736840
本篇文章只 shi例XSpringFileStorage整合oss
使用:X Spring File Storage整合oss
-
添加阿里云OSS的SDK
-
添加maven依赖
- 底层聚合工程添加版本
<!--hutool工具类--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.10</version> </dependency> <!-- spring-file-storage 必须要引入 --> <dependency> <groupId>cn.xuyanwu</groupId> <artifactId>spring-file-storage</artifactId> <version>0.5.0</version> </dependency> <!-- 阿里云 OSS 不使用的情况下可以不引入 --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.1</version> </dependency>
-
yml配置
spring: file-storage: aliyun-oss: # 阿里云 OSS ,不使用的情况下可以不写 - platform: aliyun-oss-1 # 存储平台标识 enable-storage: true # 启用存储 access-key: LTAI****NkM secret-key: PJB0****kwyhII7TH end-point: oss-cn-beijing.aliyuncs.com bucket-name: gtflog domain: https://gtflog.oss-cn-beijing.aliyuncs.com/ base-path: hy/ # 基础路径
- sql
-- 这里使用的是 mysql 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(32) 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(32) DEFAULT NULL COMMENT '缩略图MIME类型', `object_id` varchar(32) DEFAULT NULL COMMENT '文件所属对象id', `object_type` varchar(32) DEFAULT NULL COMMENT '文件所属对象类型,例如用户头像,评价图片', `attr` text COMMENT '附加属性', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ROW_FORMAT = DYNAMIC COMMENT ='文件记录表';
-
自己需要使用数据库逆向工具
-
这里需要注意的是文件id的自增属性。一定要设置哦
-
service
/** * @author gtf * @date 2022/11/22 15:41 */ public interface FileService { /** * 文件上传 * * @param file * @return */ String uploadPlatform(MultipartFile file); }
- serviceImpl(实现了 FileRecord 接口文件上传完毕后会自动保存到数据库)
package net.classes.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.xuyanwu.spring.file.storage.FileInfo; import cn.xuyanwu.spring.file.storage.FileStorageService; import cn.xuyanwu.spring.file.storage.recorder.FileRecorder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import net.classes.mapper.FileDetailMapper; import net.classes.model.FileDetailDO; import net.classes.service.FileService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.util.Date; /** * @author gtf * @date 2022/11/22 15:42 */ @Service @Slf4j public class FileStorageServiceImpl extends ServiceImpl<FileDetailMapper, FileDetailDO> implements FileRecorder, FileService { @Autowired(required = false) private FileStorageService fileStorageService; /** * 保存文件信息到数据库 */ @SneakyThrows @Override public boolean record(FileInfo info) { FileDetailDO detail = BeanUtil.copyProperties(info, FileDetailDO.class, "attr"); //这是手动获 取附加属性字典 并转成 json 字符串,方便存储在数据库中 if (info.getAttr() != null) { detail.setAttr(new ObjectMapper().writeValueAsString(info.getAttr())); } boolean b = save(detail); if (b) { info.setId(detail.getId()); } return b; } /** * 根据 url 查询文件信息 */ @SneakyThrows @Override public FileInfo getByUrl(String url) { FileDetailDO detail = getOne(new QueryWrapper<FileDetailDO>().eq("url", url)); FileInfo info = BeanUtil.copyProperties(detail, FileInfo.class, "attr"); //这是手动获取数据库中的 json 字符串 并转成 附加属性字典,方便使用 if (StringUtils.isNotBlank(detail.getAttr())) { info.setAttr(new ObjectMapper().readValue(detail.getAttr(), Dict.class)); } return info; } /** * 根据 url 删除文件信息 */ @Override public boolean delete(String url) { return remove(new QueryWrapper<FileDetailDO>().eq("url", url)); } /** * 文件上传并返回url * * @param file * @return */ @Override public String uploadPlatform(MultipartFile file) { // 上传到指定的存储平台 FileInfo upload = fileStorageService.of(file).setPlatform("aliyun-oss-1") // 使用指定的存储平台 .setPath(DateUtil.format(new Date(), "yyyy/MM/dd") + "/").upload(); //异步保存文件到数据库 // record(upload); //返回成功的url return upload.getUrl(); } }
启动类添加@EnableFileStorage
-
测试
-
数据库查看