springboot初步集成MinIO开发记录
- 说明
- 一:引入maven依赖
- 二:手动注入minioClient
- 三:创建service类
- 四:测试打印连接信息
- 五:时区转化工具类
- 六:常用操作演示
说明
- 这里只是作者开发的记录,已备将来完善和复习!内容很简单,大佬请路过。
一:引入maven依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
二:手动注入minioClient
- 由于minio官方没有提供
spring-boot-starter-minio
的启动类,所以,这里选择手动注入! - 在项目根目录下创建
config
软件包,创建config
类
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint("http://ip:9000")
.credentials("minioadmin","minioadmin")
.build();
}
}
三:创建service类
import io.minio.MinioClient;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@Service
public class MinioService {
@Resource
private MinioClient minioClient;
public void testMinioClient(){
System.out.print(minioClient);
}
}
四:测试打印连接信息
@SpringBootTest
class MinioApplicationTests {
@Resource
private MinioService minioService;
@Resource
private MinioClient minioClient;
@Test
void test() {
minioService.testMinioClient();
}
}
io.minio.MinioClient@7302ff13
五:时区转化工具类
- 如果你困惑于文件最后修改时间和代码程序查询结果不一致,参看Minio(官方docker版)容器部署时区问题研究记录
package com.yang.miniostudy01.utils;
import java.lang.annotation.Retention;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
public class TimeConverter {
private static final DateTimeFormatter isoFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral('T')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.optionalStart()
.appendOffsetId()
.optionalEnd()
.toFormatter();
private static final DateTimeFormatter customFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral('T')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.appendLiteral('Z')
.toFormatter();
public static String convertUtcToLocal(String utcTimeString) {
String zoneIdString="Asia/Shanghai";
return convertUtcToLocal(utcTimeString,zoneIdString);
}
public static String convertUtcToLocal(String utcTimeString, String zoneIdString) {
Instant utcTime = Instant.parse(utcTimeString);
ZonedDateTime localTime = utcTime.atZone(ZoneId.of(zoneIdString));
DateTimeFormatter formatter = customFormatter.withZone(ZoneId.of(zoneIdString));
return formatter.format(localTime);
}
public static String convertLocalToUtc(String localTimeString) {
String zoneIdString="Asia/Shanghai";
return convertLocalToUtc(localTimeString,zoneIdString);
}
public static String convertLocalToUtc(String localTimeString, String zoneIdString) {
ZonedDateTime localTime = ZonedDateTime.parse(localTimeString, customFormatter.withZone(ZoneId.of(zoneIdString)));
Instant utcTime = localTime.toInstant();
return isoFormatter.format(utcTime.atZone(ZoneId.of("UTC")));
}
}
六:常用操作演示
package com.yang.miniostudy01;
import com.yang.miniostudy01.service.MinioService;
import com.yang.miniostudy01.utils.TimeConverter;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class MinioApplicationTests {
@Resource
private MinioService minioService;
@Resource
private MinioClient minioClient;
@Test
void testBucketExists(){
try {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test1").build());
System.out.println("桶存在:"+exists);
} catch (ErrorResponseException | XmlParserException | InsufficientDataException | InternalException |
ServerException | InvalidKeyException | InvalidResponseException | IOException |
NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
@Test
void testBucketCreate() throws Exception {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test02").build());
if (!exists){
minioClient.makeBucket(MakeBucketArgs.builder().bucket("test02").build());
}
System.out.println("bucket已存在,无需创建");
}
@Test
void testBucketList() throws Exception {
List<Bucket> buckets = minioClient.listBuckets();
buckets.forEach(bucket-> System.out.println(bucket.name()+"--"+bucket.creationDate()));
}
@Test
void testBucketRemove() throws Exception {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test02").build());
}
@Test
void testObjectPut() throws Exception{
File file = new File("src/main/resources/picture/image.jpg");
ObjectWriteResponse response = minioClient.putObject(
PutObjectArgs.builder()
.bucket("test02")
.object("image.jpg")
.stream(new FileInputStream(file),file.length(),-1)
.build()
);
System.out.print(response);
}
@Test
void testObjectUpload() throws Exception {
ObjectWriteResponse response = minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket("test02")
.object("image3.jpg")
.filename("src/main/resources/picture/image.jpg")
.build()
);
System.out.println(response);
}
@Test
void testObjectExists() throws Exception {
StatObjectResponse response = minioClient.statObject(
StatObjectArgs.builder()
.bucket("test02")
.object("image.jpg")
.build()
);
System.out.println("修改前文件信息:"+response);
String localLastModifiedTime = TimeConverter.convertUtcToLocal(response.lastModified().toString());
ZonedDateTime localLastModified = ZonedDateTime.parse(localLastModifiedTime);
try {
Field lastModifiedField = response.getClass().getDeclaredField("lastModified");
lastModifiedField.setAccessible(true);
lastModifiedField.set(response, localLastModified);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("修改后文件信息:"+response);
}
@Test
void testObjectUrl() throws Exception {
String objectUrl = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket("test02")
.object("image.jpg")
.method(Method.GET)
.expiry(5, TimeUnit.MINUTES)
.build()
);
System.out.println(objectUrl);
}
@Test
void testBucketCreateWithPrivilege() throws Exception {
String bucketName="test02";
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!exists){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}else{
System.out.println("bucket已存在,无需创建");
}
String policyJson = "{\n" +
" \"Version\": \"2012-10-17\",\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Sid\": \"PublicRead\",\n" +
" \"Effect\": \"Allow\",\n" +
" \"Principal\": \"*\",\n" +
" \"Action\": \"s3:GetObject\",\n" +
" \"Resource\": \"arn:aws:s3:::" + bucketName + "/*\"\n" +
" }\n" +
" ]\n" +
"}";
minioClient.setBucketPolicy(
SetBucketPolicyArgs.builder()
.bucket(bucketName)
.config(policyJson)
.build()
);
}
@Test
public void testObjectDownload() throws Exception {
GetObjectResponse objectFile = minioClient.getObject(
GetObjectArgs.builder()
.bucket("test02")
.object("image.jpg")
.build()
);
System.out.println(objectFile.transferTo(new FileOutputStream("src/main/resources/picture/test.jpg")));
}
@Test
public void testObjectList(){
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket("test02")
.build()
);
results.forEach((itemResult)->{
try {
Item item = itemResult.get();
System.out.println(item.objectName()+" \t"+item.lastModified()+"\t"+item.size());
} catch (ErrorResponseException | XmlParserException | ServerException | NoSuchAlgorithmException |
InvalidResponseException | InsufficientDataException | InvalidKeyException | IOException |
InternalException e) {
throw new RuntimeException(e);
}
});
}
@Test
public void testRemoveObject() throws Exception {
minioClient.removeObject(
RemoveObjectArgs.builder()
.bucket("test02")
.object("5g3pl8.jpg")
.build()
);
}
}