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
@AutowiredMinioFileService 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")@Configurationpublic class MinoConfiguration {}
复制代码
定义我们的注解类
主要用于定义和引入 Spring 的配置信息类作为注解的方式进行启动,例如,我们下面的 EnableMinioClient。
@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.FIELD})@SpringBootConfiguration@Import(MinoConfiguration.class)public @interface EnableMinioClient {}
复制代码
使用启动我们的 MINIO 客户端
@Slf4j@SpringBootApplication@EnableMinioClientpublic 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); } }
复制代码
至此,所有的代码实现全部完成!
评论