注意
本文档适用于 Ceph 开发版本。
Java S3 示例
前提条件
所有示例都是针对 AWS Java SDK 2.17.42 编写的。在使用其他客户端时,您可能需要更改一些代码。
设置
以下示例可能需要导入以下一个或多个 Java 类:
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.nio.file.Paths;
import java.util.List;
import java.util.ListIterator;
import java.time.Duration;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.Bucket;
import software.amazon.awssdk.services.s3.model.ListBucketsResponse;
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.S3Object;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
如果您只是测试 Ceph 对象存储服务,请考虑使用 HTTP 协议而不是 HTTPS 协议。
首先,导入AwsBasicCredentials
和S3Client
类。
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.services.s3.S3Client;
然后,使用客户端构建器创建一个 S3 客户端:
AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
S3Client client = S3Client.builder()
.endpointOverride(new URI("https://endpoint.com"))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.serviceConfiguration(srvcConf -> {
srvcConf.pathStyleAccessEnabled();
})
.region(Region.US_EAST_1) // this is not used, but the AWS SDK requires it
.build();
列出拥有的存储桶
这会获取你拥有的存储桶列表。
ListBucketsResponse lbResponse = client.listBuckets();
for (Bucket bucket : lbResponse.buckets()) {
System.out.println(bucket.name() + "\t" + bucket.creationDate());
}
输出看起来会像这样:
mahbuckat1 2021-09-20T14:12:57.231Z
mahbuckat2 2021-09-20T14:12:59.402Z
mahbuckat3 2021-09-20T14:13:02.288Z
创建存储桶
这会创建一个名为my-new-bucket
client.createBucket(req -> {
req.bucket("my-new-bucket");
});
列出存储桶的内容
这会获取存储桶中的对象列表。
ListObjectsResponse loResponse = client.listObjects(req -> {
req.bucket("my-bucket");
});
for (S3Object object : loResponse.contents()) {
System.out.println(
object.key() + "\t" +
object.size() + "\t" +
object.lastModified()
);
}
输出看起来会像这样:
myphoto1.jpg 251262 2021-09-20T17:47:07.317Z
myphoto2.jpg 262518 2021-09-20T17:49:46.872Z
删除存储桶
Note
存储桶必须是空的!否则它将不起作用!
client.deleteBucket(req -> {
req.bucket("my-new-bucket");
});
非空存储桶的强制删除
注意
不可用
创建对象
这会创建一个文件hello.txt
包含字符串"Hello World!"
ByteBuffer input = ByteBuffer.wrap("Hello World!".getBytes());
client.putObject(
req -> {
req.bucket("my-bucket").key("hello.txt");
},
RequestBody.fromByteBuffer(input)
);
更改对象的 ACL
这会使对象hello.txt
对公众可读,secret_plans.txt
并且是私有的。
client.putObjectAcl(req -> {
req.bucket("my-bucket").key("hello.txt").acl(ObjectCannedACL.PUBLIC_READ);
});
client.putObjectAcl(req -> {
req.bucket("my-bucket").key("secret_plans.txt").acl(ObjectCannedACL.PRIVATE);
});
下载对象(到文件)
这会下载对象perl_poetry.pdf
并将其保存到/home/larry/documents
client.getObject(
req -> {
req.bucket("my-bucket").key("perl_poetry.pdf");
},
Paths.get("/home/larry/documents/perl_poetry.pdf")
);
删除对象
这会删除对象goodbye.txt
client.deleteObject(req -> {
req.bucket("my-bucket").key("goodbye.txt");
});
生成对象下载 URL(签名和未签名的)
这会为hello.txt
生成一个未签名的下载 URL。这之所以有效,是因为我们通过上述设置 ACL 使其公开。hello.txt
public by setting the ACL above.
This then generates a signed download URL for secret_plans.txt
生成一个签名下载 URL,该 URL 将在 1 小时内有效。签名下载 URL 即使对象是私有的,在有效期内也会有效(当有效期结束时,URL 将停止工作)。
Note
Java 库没有生成未签名 URL 的方法,因此以下示例仅生成一个签名 URL。
S3Presigner presigner = S3Presigner.builder()
.endpointOverride(new URI("https://endpoint.com"))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.region(Region.US_EAST_1) // this is not used, but the AWS SDK requires it
.build();
PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(preReq -> {
preReq.getObjectRequest(req -> {
req.bucket("my-bucket").key("secret_plans.txt");
}).signatureDuration(
Duration.ofMinutes(20)
);
});
System.out.println(presignedRequest.url());
输出看起来会像这样:
https://endpoint.com/my-bucket/secret_plans.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20210921T151408Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1200&X-Amz-Credential=XXXXXXXXXXXX%2F20210921%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=yyyyyyyyyyyyyyyyyyyyyy
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.