springboot初步集成MinIO开发记录  说明 一:引入maven依赖 二:手动注入minioClient 三:创建service类 四:测试打印连接信息 五:时区转化工具类 六:常用操作演示   
 
这里只是作者开发的记录,已备将来完善和复习!内容很简单,大佬请路过。 < dependency> < groupId> </ groupId> < artifactId> </ artifactId> < version> </ version> </ dependency> 由于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 ( ) ; } 
} 
 
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 > =  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 > > =  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 ( ) ) ; } 
}