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 ( )
) ;
}
}