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
-
测试
-
数据库查看