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