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