Minio文件储存解决方案JavaWeb篇
前言:本文为单体架构文件上传到Minio解决方案,工作中用到在这里记录一下
介绍
MinIO是对象存储服务。它基于Apache License 开源协议,兼容Amazon S3云存储接口。适合存储非结构化数据,如图片,音频,视频,日志等。对象文件最大可以达到5TB。
官网
http://www.minio.org.cn/
安装
本文不介绍安装,请读者按照官网提供方式,结合操作系统进行安装。
起步
1.0 引入坐标
<!--minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.3</version>
</dependency>
<!-- okHttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
Miniio配置
1.1 全局配置文件
minio:
endpoint: 127.0.0.1
port: 9000
accessKey: minioadmin
secretKey: minioadmin
secure: false
bucketName: "kdd-crm"
configDir: "/data/excel"
读取配置
/**
* @className: MinioConfig
* @author Hope
* @date 2020/7/28 13:43
* @description: MinioConfig
*/
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
private final static String HTTP = "http://";
//endPoint是一个URL,域名,IPv4或者IPv6地址
private String endpoint;
//TCP/IP端口号
private int port;
//accessKey类似于用户ID,用于唯一标识你的账户
private String accessKey;
//secretKey是你账户的密码
private String secretKey;
//如果是true,则用的是https而不是http,默认值是true
private Boolean secure;
//默认存储桶
private String bucketName;
}
代码使用案例
controller层
@PostMapping("/common/upload")
public AjaxResult uploadFile(MultipartFile file){
try{
// 上传文件路径
return fileService.upload(file);
}catch (Exception e){
return AjaxResult.error(e.getMessage());
}
}
service
/**
* 获取Minio连接的方法
* 获取Minio连接
* @return
*/
//需要先注入
//MinioConfig minioConfig;
private MinioClient getClient(){
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://"+minioConfig.getEndpoint()+":"+ minioConfig.getPort())
.credentials(minioConfig.getAccessKey(),minioConfig.getSecretKey())
.build();
return minioClient;
}
上传方法
public AjaxResult upload(MultipartFile file) {
InputStream inputStream = null;
//创建Minio的连接对象
MinioClient minioClient = getClient();
//桶的名称
String bucketName = minioConfig.getBucketName();
try {
inputStream = file.getInputStream();
// 检查存储桶是否已经存在
BucketExistsArgs bucket = BucketExistsArgs.builder().bucket(bucketName).build();
boolean isExist = minioClient.bucketExists(bucket);
if(!isExist) {
// 桶不存在就创建一个
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
// 使用putObject上传一个文件到存储桶中。
//格式需求 桶名称/年/月/日/uuid.pdf 桶名称/2022/08/30/uuid.pdf
///年/月/日/调时间工具类 datePath方法
String datePath = DateUtils.datePath();
String filename = UUID.randomUUID()+".pdf";
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(datePath+ "/" + filename).stream(inputStream, inputStream.available(), -1)
.build());
inputStream.close();
/**
* 构建返回结果集
*/
AjaxResult ajax = AjaxResult.success();
/**
* 封装需要的数据进行返回
* 这里可以用put封装返回给前端是数据
*/
return ajax;
}catch(Exception e){
e.printStackTrace();
return AjaxResult.error("上传失败");
}finally {
//防止内存泄漏
if (inputStream != null) {
try {
inputStream.close(); // 关闭流
} catch (IOException e) {
log.debug("inputStream close IOException:" + e.getMessage());
}
}
}
}
public Builder stream(InputStream stream, long objectSize, long partSize)方法参数介绍
官方注释
设置要上载的流。提供对象/零件尺寸的两种方法。
如果对象大小未知,将-1传递给objectSize并传递有效的partSize。
如果对象大小已知,将-1传递到partSize以进行自动检测;否则,传递有效的partSize以控制内存使用和上传中的零件数量。 如果partSize大于objectSize,则objectSize用作partSize。
有效零件尺寸介于5MiB到5GiB之间(包括两个极限)。
所以我们这里设置partSize为-1
获取路径也是很简单的
"http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + bucketName +"/"+ datePath + "/" + filename
有什么不妥的地方欢迎大家和我讨论,谢谢