Maven 依赖的配置
首先增加对应的配置依赖,添加 MINIO 的客户端依赖,目前比较稳定的。客户端组件是 com.jvm123 的客户端 starter, 我们会基于他进行二次封装,形成可插拔化且集成化更高的的 OSS 客户端。
具体配置可见如下依赖:
<dependency>
<groupId>com.jvm123</groupId>
<artifactId>minio-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
复制代码
在这里,我们选择的版本是 1.2.1 的这个版本,具体也有更高的版本,但是我们本次的一个演示主要以此版本为主。
定义 OSS 数据模型
接下来呢,我们需要定一下我 OSS 的传输、操作等相关的数据模型。
我们定义其名称为:OssProcessDTO 类。
@Data
@SuppressWarnings("serial")
public class OssProcessDTO implements Serializable {
private String filePath;
private String bucketName;
private String fileName;
}
复制代码
从上面我们可以看到我们主要的属性,只有三个部分:
filePath: 数据文件的目录其他都有了访问地址, 主要用于传输本地的文件的目录信息以及存储在 OS X 部分的目录信息,作为他的主要作用。
bucketName: 主要作为协议的 Bucket 名称,大家可以理解为命名空间进行隔离的边界。
fileName: 主要作为存储文件的名称,方便后续进行名称的一个替换,以及原始名称的存储。
定义模型类
定一下模型类,如下所示:
@Data
@SuppressWarnings("serial")
public class OssProcessDTO implements Serializable {
private String filePath;
private String bucketName;
private String fileName;
}
复制代码
定义数据传输模型
定义一个 RPC 请求数据模型
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class RpcRequest<T> implements Serializable {
private String id;
private T enity;
public RpcRequest(T enity) {
this.enity = enity;
}
public RpcRequest(String id, T enity) {
this.id = id;
this.enity = enity;
}
public RpcRequest(String id) {
this.id = id;
}
}
复制代码
核心功能接口定义
接下来呢我们要定义对应的依赖关系和定义我们的逻辑接口,命名为:RpcOssOperateRpcApi。
public interface RpcOssOperateRpcApi {
/**
* bucket
* @param rpcRequest:内部存储对应的BucketName
* @return
*/
RpcResponse create(RpcRequest<String> rpcRequest);
/**
* 存储文件
* @param rpcRequest filePath和bucketName
* @return
*/
RpcResponse upload(RpcRequest<OssProcessDTO> rpcRequest);
/**
* 删除文件
* @param rpcRequest bucketName 和 fileName
* @return
*/
RpcResponse remove(RpcRequest<OssProcessDTO> rpcRequest);
/**
* 下载文件
* @param rpcRequest bucketName 和 fileName
* @return
*/
RpcResponse download(RpcRequest<OssProcessDTO> rpcRequest);
}
复制代码
实际上还有很多,我们暂时定一个基础的接口就可以了。
内部创建对应的 BucketName 的 Bucket 对象
rpcRequest:内部存储对应的 BucketName
RpcResponse create(RpcRequest<String> rpcRequest);
复制代码
上传且存储文件
/**
* 存储文件
* @param rpcRequest filePath和bucketName
* @return
*/
RpcResponse upload(RpcRequest<OssProcessDTO> rpcRequest);
复制代码
删除 OSS 文件
/**
* 删除文件
* @param rpcRequest bucketName 和 fileName
* @return
*/
RpcResponse remove(RpcRequest<OssProcessDTO> rpcRequest);
复制代码
下载 OSS 文件
/**
* 下载文件
* @param rpcRequest bucketName 和 fileName
* @return
*/
RpcResponse download(RpcRequest<OssProcessDTO> rpcRequest);
复制代码
实现对应 OSS 功能
接下来我们要去实现上面定义的 RpcOssOperateRpcApi 接口。
我们建立一个新的实现类:MinioRpcOssService,并且进行实现对应的接口 RpcOssOperateRpcApi。
对此我们需要依赖注入一个 MINIO 核心 SDK 的业务操作类:MinioFileService
@Autowired
MinioFileService fileStoreService;
复制代码
实现 create 方法
主要调用了他创建 bucket 的实现类方法。如下面代码所示。
/**
* 创建的操作处理控制
* @param rpcRequest:内部存储对应的BucketName
* @return
*/
@Override
public RpcResponse create(RpcRequest<String> rpcRequest) {
return fileStoreService.createBucket(rpcRequest.getEnity())? RpcResponse.success(): RpcResponse.failure("创建oss bucket失败!");
}
复制代码
实现 upload 方法
主要调用它保存文件的 save 方法,在这里我们主要是将上传过来的文件进行转换为数据流。并且指定对应的 bucket 的名字以及原始的文件名。
/**
* 上传服务文件处理
* @param rpcRequest filePath和bucketName
* @return
*/
@Override
public RpcResponse upload(RpcRequest<OssProcessDTO> rpcRequest) {
try( InputStream inputStream =
IoUtil.toStream(new File(rpcRequest.getEnity().getFilePath()));) {
fileStoreService.save(rpcRequest.getEnity().getBucketName(), inputStream, rpcRequest.getEnity().getFileName());
}catch (Exception e) {
log.error("upload the file is error",e);
return RpcResponse.failure("upload the file is error");
}
return RpcResponse.success();
}
复制代码
实现 remove 方法
主要是用于删除 OSS 服务器上的对应的文件。主要用于删除对应的 bucket 的下面对应的文件。那么我们要指定他的原始文件名称。
/**
* 删除文件地下
* @param rpcRequest bucketName 和 fileName
* @return
*/
@Override
public RpcResponse remove(RpcRequest<OssProcessDTO> rpcRequest) {
return fileStoreService.delete(rpcRequest.getEnity().getBucketName(),
rpcRequest.getEnity().getFileName())?
RpcResponse.success(): RpcResponse.failure("删除oss bucket文件失败!");
}
复制代码
实现 download 方法
下载文件处理控制,主要用于传输我们的 bucket 的名称以及文件的把我们的文件的名称,就可以完成下载对应的文件数据。
/**
* 下载文件处理控制
* @param rpcRequest
* @return
*/
@Override
public RpcResponse download(RpcRequest<OssProcessDTO> rpcRequest) {
try(
OutputStream outputStream =
new FileOutputStream(rpcRequest.getEnity().getFilePath());
) {
fileStoreService.writeTo(rpcRequest.getEnity().getBucketName(), rpcRequest.getEnity().getFileName(), outputStream);
} catch (IOException e) {
log.error("download file is failure!",e);
return RpcResponse.failure("下载oss bucket文件失败!");
}
return RpcResponse.success(rpcRequest.getEnity().getFilePath());
}`
复制代码
封装为 SpringBoot 的 starter
建立 Configuration 主要扫描我们的组件
我们建立一个 configuration 类。主要用于扫描我们的所对应的 MINIO 的客户端组件,主要就可以去扫描我们刚才定义的这个实现类。当然你也可以使用 @Bean 的方式进行注入:
@ComponentScan("com.hyts.assemble.minio")
@Configuration
public class MinoConfiguration {
}
复制代码
定义我们的注解类
主要用于定义和引入 Spring 的配置信息类作为注解的方式进行启动,例如,我们下面的 EnableMinioClient。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD})
@SpringBootConfiguration
@Import(MinoConfiguration.class)
public @interface EnableMinioClient {
}
复制代码
使用启动我们的 MINIO 客户端
@Slf4j
@SpringBootApplication
@EnableMinioClient
public class OssClientApplication {
public static void main(String[] args) {
try {
ApplicationContext applicationContext = SpringApplication.run(OssClientApplication.class,args);
log.info("请访问MINIO控制台:{}",applicationContext.getBean(MinioProperties.class).getEndpoint());
ServerProperties serverProperties = applicationContext.getBean(ServerProperties.class);
log.info("请访问swagger访问页面:{}", "http://"+NetUtil.localIpv4s().stream().findFirst().get()+":"+
serverProperties.getPort()+"/doc.html");
} catch (Exception e) {
log.error("启动我失败!",e);
}
}
复制代码
至此,所有的代码实现全部完成!
评论