java 客户端调用minio服务

时间:2025-02-28 07:03:00

java 教程

maven项目引入jar 依赖

<dependency>
    <groupId></groupId>
    <artifactId>minio</artifactId>
    <version>8.3.5</version>
</dependency>

一、链接客户端

    //构造方法 minio客户端
    MinioClient minioClient =  ()
        .endpoint("http://youduk1:9029")
        .credentials("admin", "admin456789")
   		.build();
    ("客户端链接成功");
	
	
	MinioClient minioClient =
    ()
        .endpoint(":9000")
        .credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG")
        .region("eu-east-1")
        .httpClient(customHttpClient)
        .build();
    

二、桶操作

1、判断桶是否存在
  boolean found =
  		(().bucket("my-bucketname").build());
  if (found) {
  	("my-bucketname exists");
  } else {
  	("my-bucketname does not exist");
  }
2、创建桶
 		// 创建桶
        boolean boo = (().bucket("my-bucketname1").build());
        if (!boo) {
            (().bucket("my-bucketname1").build());
            ("my-bucketname1 is created successfully");
        }
        //创建桶指定区域
        if (!(
                ().bucket("my-bucketname-in-eu").build())) {
            (
                    ().bucket("my-bucketname-in-eu").region("eu-west-1").build());
            ("my-bucketname-in-eu is created successfully");
        }
        // Create bucket 'my-bucketname-in-eu-with-object-lock' in 'eu-west-1' with object lock
        // functionality enabled.

        //创建桶,加入锁
        if (!(
                ().bucket("my-bucketname-in-eu-with-object-lock").build())) {
            (
                    ()
                            .bucket("my-bucketname-in-eu-with-object-lock")
                            .region("eu-west-1")
                            .objectLock(true)
                            .build());
            ("my-bucketname-in-eu-with-object-lock is created successfully");
        }
3、列出所有桶
// 列出所有桶
List<Bucket> bucketList = ();
for (Bucket bucket : bucketList) {
    (() + ", " + ());
}

//列出所有桶,包括桶的信息。
List<Bucket> bucketList = (().extraHeaders(headers).build());
for (Bucket bucket : bucketList) {
  (() + ", " + ());
}


//获取加密通getBucketEncryption
SseConfiguration config =
    (
        ().bucket("my-bucketname").build());

//获取生命周期桶getBucketLifecycle
LifecycleConfiguration config =
    (
        ().bucket("my-bucketname").build());
("Lifecycle configuration: " + config);

//获取通知桶信息getBucketNotification
NotificationConfiguration config =
    (
        ().bucket("my-bucketname").build());
//获取策略桶信息getBucketPolicy        
String config =
    (().bucket("my-bucketname").build());
//获取复制桶getBucketReplication   
ReplicationConfiguration config =
    (
        ().bucket("my-bucketname").build());
//获取标签桶getBucketTags       
Tags tags = (().bucket("my-bucketname").build());
获取版本桶getBucketVersioning
VersioningConfiguration config =
    (
        ().bucket("my-bucketname").build());
//获取对象锁的桶信息getObjectLockConfiguration        
ObjectLockConfiguration config =
    (
        ().bucket("my-bucketname").build());
("Mode: " + ());
("Duration: " + ().duration() + " " + ().unit());


4、删除一个桶。

注意: - removeBucket不会删除存储桶里的对象,你需要通过removeObject API来删除它们。

  boolean found =  (().bucket("my-bucketname").build());
  if (found) {
 	(().bucket("my-bucketname").build());
    ("my-bucketname is removed successfully");
  } else {
    ("my-bucketname does not exist");
  }
  
  //删除加密桶
  (().bucket("my-bucketname").build());
  //删除桶生命周期
  (().bucket("my-bucketname").build());
  //删除桶标签
  (().bucket("my-bucketname").build());
  //删除桶策略
  (().bucket("my-bucketname").build());
  //删除桶复制配置
  (().bucket("my-bucketname").build());
  //删除桶通知
  (().bucket("my-bucketname").build());
  //删除桶对象锁object-lock配置在
  (().bucket("my-bucketname").build()); 
5、监听通信息
String[] events = {"s3:ObjectCreated:*", "s3:ObjectAccessed:*"};
try (CloseableIterator<Result<NotificationRecords>> ci =
             (
                     ()
                             .bucket("bucketName")
                             .prefix("")
                             .suffix("")
                             .events(events)
                             .build())) {
    while (()) {
        NotificationRecords records = ().get();
        for (Event event : ()) {
            ("Event " + () + " occurred at " + ()
                    + " for " + () + "/" + ());
        }
    }
}
6、列出桶中所有对象
       //列出桶中对象
       Iterable<Result<Item>> results =
                (().bucket("my-bucketname").build());
        for (Result<Item> result : results) {
            Item item = ();
            (() + "\t" + () + "\t" + ());
        }

   	    (
                        ()
                            .bucket("my-bucketname")
                            .recursive(true) //是否递归查找,如果是false,就模拟文件夹结构查找。
                            .useApiVersion1(false) //boolean	如果是true, 使用版本1 REST API
                            .startAfter("")  //在之后
                            .prefix("新建") //对象名称的前缀
                            .maxKeys(100)//列出最多100个
                            .build()
        );
        for (Result<Item> result : results1) {
            Item item = ();
            (() + "\t" + () + "\t" + ());
        }
7、设置桶信息
//设置加密
(
        ().bucket("my-bucketname").config(SseConfiguration.newConfigWithSseS3Rule()).build());
//设置生命周期
List<LifecycleRule> rules = new LinkedList<>();
(
    new LifecycleRule(
        ,
        null,
        null,
        new RuleFilter("documents/"),
        "rule1",
        null,
        null,
        new Transition((ZonedDateTime) null, 30, "GLACIER")));
(
    new LifecycleRule(
        ,
        null,
        new Expiration((ZonedDateTime) null, 365, null),
        new RuleFilter("logs/"),
        "rule2",
        null,
        null,
        null));
LifecycleConfiguration config = new LifecycleConfiguration(rules);
(
    ().bucket("my-bucketname").config(config).build());
//设置通知
List<EventType> eventList = new LinkedList<>();
(EventType.OBJECT_CREATED_PUT);
(EventType.OBJECT_CREATED_COPY);
QueueConfiguration queueConfiguration = new QueueConfiguration();
("arn:minio:sqs::1:webhook");
(eventList);
("images");
("pg");

List<QueueConfiguration> queueConfigurationList = new LinkedList<>();
(queueConfiguration);

NotificationConfiguration config = new NotificationConfiguration();
(queueConfigurationList);

(
    ().bucket("my-bucketname").config(config).build());

//设置规则
// Assume policyJson contains below JSON string;
// {
//     "Statement": [
//         {
//             "Action": [
//                 "s3:GetBucketLocation",
//                 "s3:ListBucket"
//             ],
//             "Effect": "Allow",
//             "Principal": "*",
//             "Resource": "arn:aws:s3:::my-bucketname"
//         },
//         {
//             "Action": "s3:GetObject",
//             "Effect": "Allow",
//             "Principal": "*",
//             "Resource": "arn:aws:s3:::my-bucketname/myobject*"
//         }
//     ],
//     "Version": "2012-10-17"
// }
//
(
    ().bucket("my-bucketname").config(policyJson).build());
    
//设置副本
Map<String, String> tags = new HashMap<>();
("key1", "value1");
("key2", "value2");

ReplicationRule rule =
    new ReplicationRule(
        new DeleteMarkerReplication(),
        new ReplicationDestination(
            null, null, "REPLACE-WITH-ACTUAL-DESTINATION-BUCKET-ARN", null, null, null, null),
        null,
        new RuleFilter(new AndOperator("TaxDocs", tags)),
        "rule1",
        null,
        1,
        null,
        );

List<ReplicationRule> rules = new LinkedList<>();
(rule);

ReplicationConfiguration config =
    new ReplicationConfiguration("REPLACE-WITH-ACTUAL-ROLE", rules);

(
    ().bucket("my-bucketname").config(config).build());
 
//设置标签
Map<String, String> map = new HashMap<>();
("Project", "Project One");
("User", "jsmith");
(().bucket("my-bucketname").tags(map).build());

//设置新版本
(
    ().bucket("my-bucketname").config(config).build());
//设置对象锁配置
ObjectLockConfiguration config = new ObjectLockConfiguration(, new RetentionDurationDays(100));
(().bucket("my-bucketname").config(config).build());

三、对象操作

1、对象合并
  List<ComposeSource> sourceObjectList = new ArrayList<ComposeSource>();
        (
                ().bucket("my-bucketname").object("新建文本文档.txt").build()
        );
        (
                ().bucket("my-bucketname").object("新建文本文档").build()
        );
        (
                ().bucket("my-bucketname").object("新建文本文档").build()
        );
        (());
        //创建对象my-bucketname/composeObject1 组合列表合并的数据
//        (
//                ()
//                        .bucket("my-bucketname")
//                        .object("composeObject1")
//                        .sources(sourceObjectList)
//                        .build());
        //创建对象my-bucketname/composeObject2 组合列表合并的数据, 用户结合源对象的元数据
        Map<String, String> userMetadata = new HashMap<>();
        ("My-Project", "ProjectOne");
//        (
//        ()
//                .bucket("my-bucketname")
//                .object("composeObject2")
//                .sources(sourceObjectList)
//                .userMetadata(userMetadata)
//                .build());


        //加密
        ServerSideEncryptionCustomerKey srcSsec =
                new ServerSideEncryptionCustomerKey(
                        new SecretKeySpec(
                                "01234567890123456789012345678901".getBytes(StandardCharsets.UTF_8), "AES"));
        (
                ()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .sources(sourceObjectList)
                        .userMetadata(userMetadata)
//                        .ssec(srcSsec)
                        .build());


        ServerSideEncryption sse =
                new ServerSideEncryptionCustomerKey(
                        new SecretKeySpec(
                                "12345678912345678912345678912345".getBytes(StandardCharsets.UTF_8), "AES"));
        (
                ()
                        .bucket("my-destination-bucket")
                        .object("my-destination-object")
                        .sources(sourceObjectList)
                        .userMetadata(userMetadata)
                        .sse(sse)
                        .build());
2、对象复制
//创建一个对象my-bucketname/my-objectname  数据从my-source-bucketname中复制过来
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                //.srcBucket("my-source-bucketname")
                .source(
                        ()
                                .bucket("my-source-bucketname")
                                .build())
                .build());
//创建一个对象my-bucketname/my-objectname  数据从my-source-bucketname/my-source-objectname对象中复制过来
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .source(
                        ()
                                .bucket("my-source-bucketname")
                                .object("my-source-objectname")
                                .build())
                .build());
//  //创建一个对象my-bucketname/my-objectname  数据从my-source-bucketname中复制过来 数据sse加密

ServerSideEncryption sse =
        new ServerSideEncryptionCustomerKey(
                new SecretKeySpec(
                        "12345678912345678912345678912345".getBytes(StandardCharsets.UTF_8), "AES"));
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .source(
                        ()
                                .bucket("my-source-bucketname")
                                .build())
                .sse(sse)
                .build());

Map<String, String> headersCopy = new HashMap<String,String>();
("Content-Type","json/plain");
Map<String, String> tag = new HashMap<String,String>();
("test","miniotest");
("label","miniotest");
//创建一个对象my-bucketname/my-objectname  数据从my-source-bucketname中复制过来  用户自定义headers信息
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .source(
                        ()
                                .bucket("my-source-bucketname")
                                .build())
                .headers(headersCopy)
                .tags(tag)
                .build());
3、删除对象标签
(
        ().bucket("my-bucketname").object("my-objectname").build());
4、禁用对象
// Disables legal hold on an object.
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .build());
5、启用对象
// Disables legal hold on an object.
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .build());
6、获取对象
//获得对象流
try (InputStream stream = (
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .build())) {
    // Read data from stream
}
// 获得对象流 。设置偏移量 seek用法相同
try (InputStream stream = (
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .offset(1024L)
                .build())) {
    // Read data from stream
}
// 获取读取流长度
try (InputStream stream = (
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .offset(1024L)
                .length(4096L)
                .build())) {
    // Read data from stream
}

ServerSideEncryptionCustomerKey srcSsec =
new ServerSideEncryptionCustomerKey(
        new SecretKeySpec(
                "01234567890123456789012345678901".getBytes(StandardCharsets.UTF_8), "AES"));
// 获取读取 sse-c 加密文件
try (InputStream stream = (
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .ssec(srcSsec)
                .build())) {
    // Read data from stream
}
// 获取读取 sse-c 加密文件  带偏移量 带长度
try (InputStream stream = (
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .offset(1024L)
                .length(4096L)
                .ssec(srcSsec)
                .build())) {
    // Read data from stream
}
7、下载对象
//下载文件到输出流my-filename
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .filename("my-filename")
                .build());
("my-objectname is successfully downloaded to my-filename");

//下载带有密码的文件
ServerSideEncryptionCustomerKey srcSsec =
        new ServerSideEncryptionCustomerKey(
                new SecretKeySpec(
                        "01234567890123456789012345678901".getBytes(StandardCharsets.UTF_8), "AES"));
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .ssec(srcSsec)
                .filename("my-object-file")
                .build());
8、获取对象副本
 // Object with version id.
    Retention retention =
            (
                    ()
                            .bucket("my-bucketname")
                            .object("my-objectname")
                            .versionId("object-version-id")
                            .build());
    ("mode: " + () + "until: " + ());

9、获取对象标签
Tags tags = (
        ().bucket("my-bucketname").object("my-objectname").build());
10、获得预对象路径
String url =  (
                ()
                        .method() //get 方法
                        .bucket("my-bucketname") // 名称
                        .object("") //对象名称
                        .expiry(2, ) //过期时间
                        .extraQueryParams(reqParams)  //参数配置
                        .build());
(url);
//设置过期时间为1天
String url1 =
        (
                ()
                        .method()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .expiry(1, )  //设置过期1天
                        .build());
(url1);
String url3 =
        (
                ()
                        .method()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .expiry(2, )
                        .extraQueryParams(reqParams)
                        .build());
(url3);
11、对象是否合法
//查看对象是否可用
boolean status =
        (
                ()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .versionId("object-versionId")
                        .build());
if (status) {
    ("Legal hold is on");
}
else {
        ("Legal hold is off");
}
12、form-data表达上传数据
//创建一个桶  规则7 天后过期
PostPolicy policy = new PostPolicy("my-bucketname", ().plusDays(7));
//设置对象名
("key", "");
//设置Content-Type条件
("Content-Type", "image/");
//设置上传文件大小between 64kiB to 10MiB.
(/*64 * 1024*/ 0, 10 * 1024 * 1024);
Map<String, String> formData = (policy);
// Upload an image using POST object with form-data.
 multipartBuilder = new ();
();
for (<String, String> entry : ()) {
    ((), ());
}
("key", "");
("Content-Type", "image/png");
(
        "file", "", (new File("d://"), null)
);
Request request =
        new ()
                .url("http://youduk1:9029/my-bucketname")
                .post(())
                .build();
OkHttpClient httpClient = new OkHttpClient().newBuilder().build();
Response response = (request).execute();
if (()) {
    ("Pictures/ is uploaded successfully using POST object");
} else {
    ("Failed to upload Pictures/");
}
13、上传流数据到对象
  		//上传已经长度的流
        File f = new File("D://");
        InputStream inputStream =new FileInputStream(f);
        (
                ().bucket("my-bucketname").object("").stream(
                        inputStream, (), -1)
                        .contentType("image/jpg")
                        .build());
        //上传未知长度的流
        (
                ().bucket("my-bucketname").object("").stream(
                        inputStream, -1, 10485760)
                        .contentType("image/jpg")
                        .build());
		//创建路径
        (
                ().bucket("my-bucketname").object("path/to/").stream(
                        new ByteArrayInputStream(new byte[] {}), 0, -1)
                        .build());
        //上传带有标题和用户元数据的输入流。
        Map<String, String> headers = new HashMap<>();
        ("X-Amz-Storage-Class", "REDUCED_REDUNDANCY");
        Map<String, String> userMetadata = new HashMap<>();
        ("My-Project", "Project One");
        (
                ().bucket("my-bucketname").object("path/to/").stream(
                        inputStream, (), -1)
                        .headers(headers)
                        .userMetadata(userMetadata)
                        .build());
        //上传文件加密
        ServerSideEncryption sse =
                new ServerSideEncryptionCustomerKey(
                        new SecretKeySpec(
                                "12345678912345678912345678912345".getBytes(StandardCharsets.UTF_8), "AES"));
        (
                ().bucket("my-bucketname").object("my-objectname").stream(
                        inputStream, (), -1)
                        .sse(sse)
                        .build());
14、上传文件
// 上传json文件.
(
        ()
                .bucket("my-bucketname").object("my-objectname").filename("d://").build());
// 上传mp4文件
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .filename("D:/")
                .contentType("video/mp4")
                .build());
15、批量上传多个文件
    List<SnowballObject> objects = new ArrayList<SnowballObject>();
    (
            new SnowballObject(
                    "my-object-one",
                    new ByteArrayInputStream("hello".getBytes(StandardCharsets.UTF_8)),
                    5,
                    null));
    (
            new SnowballObject(
                    "my-object-two",
                    new ByteArrayInputStream("java".getBytes(StandardCharsets.UTF_8)),
                    4,
                    null));
    (
            ().bucket("my-bucketname").objects(objects).build());
16、删除对象
// 删除对象
(
        ().bucket("my-bucketname").object("my-objectname").build());

// 删除对应版本的对象
(
        ()
                .bucket("my-bucketname")
                .object("my-versioned-objectname")
                .versionId("my-versionid")
                .build());

// 绕过治理模式删除版本化对象。
(
        ()
                .bucket("my-bucketname")
                .object("my-versioned-objectname")
                .versionId("my-versionid")
                .bypassGovernanceMode(true)
                .build());
17、批量删除对象
List<DeleteObject> objects = new LinkedList<>();
(new DeleteObject("my-objectname1"));
(new DeleteObject("my-objectname2"));
(new DeleteObject("my-objectname3"));
Iterable<Result<DeleteError>> results =
        (
                ().bucket("my-bucketname").objects(objects).build());
for (Result<DeleteError> result : results) {
    DeleteError error = ();
    (
            "Error in deleting object " + () + "; " + ());
}
18、选取对象内容

选择内容对象的SQL表达式

String sqlExpression = "select * from S3Object limit  0,10 ";
InputSerialization is = new InputSerialization(null, false, null, null, , null, null, null);
OutputSerialization os = new OutputSerialization(null, null, null, , null);
SelectResponseStream stream =
        (
                ()
                        .bucket("my-bucketname")
                        .object("")
                        .sqlExpression(sqlExpression)
                        .inputSerialization(is)
                        .outputSerialization(os)
                        .requestProgress(true)
                        .build());

byte[] buf = new byte[512];
int bytesRead = (buf, 0, );
(new String(buf, 0, bytesRead, StandardCharsets.UTF_8));

Stats stats = ();
("bytes scanned: " + ());
("bytes processed: " + ());
("bytes returned: " + ());

();
19、设置对象保留配置
Retention retention = new Retention(, ().plusYears(1));
(
        ()
                .bucket("my-bucketname")
                .object("my-objectname")
                .config(retention)
                .bypassGovernanceMode(true)
                .build());
20、为对象设置标签
Map<String, String> map = new HashMap<>();
("Project", "Project One");
("User", "jsmith");
(
        ().bucket("my-bucketname").object("").tags(map).build());
21、获取对象信息和元数据对象
ServerSideEncryptionCustomerKey srcSsec =
        new ServerSideEncryptionCustomerKey(
                new SecretKeySpec(
                        "01234567890123456789012345678901".getBytes(StandardCharsets.UTF_8), "AES"));
// 获取对象信息
StatObjectResponse objectStat =
        (
                ().bucket("my-bucketname").object("my-objectname").build());
// 获取SSE-C加密对象
StatObjectResponse objectStat1 =
        (
                ()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .ssec(srcSsec)
                        .build());

// 获取带版本的对象
StatObjectResponse objectStat2 =
        (
                ()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .versionId("version-id")
                        .build());
// 获取带版本号的SSE-C加密对象
StatObjectResponse objectStat3 =
        (
                ()
                        .bucket("my-bucketname")
                        .object("my-objectname")
                        .versionId("version-id")
                        .ssec(srcSsec)
                        .build());