java// 获取最新版本
try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder()
.bucket("my-bucket")
.object("path/to/file.txt")
.build())) {
// 处理输入流
}
// 获取特定版本
try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder()
.bucket("my-bucket")
.object("path/to/file.txt")
.versionId("version-id-here")
.build())) {
// 处理输入流
}
javaminioClient.downloadObject(
DownloadObjectArgs.builder()
.bucket("my-bucket")
.object("path/to/file.txt")
.filename("/local/path/save.txt")
.build());
javaStatObjectResponse stat = minioClient.statObject(
StatObjectArgs.builder()
.bucket("my-bucket")
.object("path/to/file.txt")
.build());
System.out.println("ETag: " + stat.etag());
System.out.println("Size: " + stat.size());
System.out.println("Last Modified: " + stat.lastModified());
System.out.println("Content Type: " + stat.contentType());
javaStatObjectResponse stat = minioClient.statObject(
StatObjectArgs.builder()
.bucket("my-bucket")
.object("path/to/file.txt")
.build());
Map<String, String> userMetadata = stat.userMetadata();
System.out.println("Custom Metadata: " + userMetadata);
Minio本身不提供直接通过自定义元数据查询对象的API,但可以通过以下方式实现:
java// 1. 列出所有对象
Iterable<Result<Item>> objects = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket("my-bucket")
.prefix("path/") // 限定目录
.recursive(true)
.build());
// 2. 过滤包含特定元数据的对象
List<String> matchedObjects = new ArrayList<>();
for (Result<Item> result : objects) {
Item item = result.get();
StatObjectResponse stat = minioClient.statObject(
StatObjectArgs.builder()
.bucket("my-bucket")
.object(item.objectName())
.build());
if ("expected-value".equals(stat.userMetadata().get("custom-metadata-key"))) {
matchedObjects.add(item.objectName());
}
}
对于大量数据,更高效的做法是维护外部索引(如数据库):
java// 1. 上传对象时记录元数据到数据库
public void uploadWithMetadata(String objectPath, InputStream data, Map<String, String> metadata) {
// 上传到Minio
minioClient.putObject(
PutObjectArgs.builder()
.bucket("my-bucket")
.object(objectPath)
.userMetadata(metadata)
.stream(data, -1, 10485760)
.build());
// 同时记录到数据库
jdbcTemplate.update(
"INSERT INTO object_metadata (object_path, metadata_key, metadata_value) VALUES (?, ?, ?)",
objectPath,
"custom-key",
metadata.get("custom-key"));
}
// 2. 通过数据库查询获取对象路径
public List<String> findObjectsByMetadata(String key, String value) {
return jdbcTemplate.queryForList(
"SELECT object_path FROM object_metadata WHERE metadata_key = ? AND metadata_value = ?",
String.class,
key,
value);
}
配置Minio事件通知,当对象创建/更新时将元数据同步到外部系统:
java// 配置Minio事件通知(通常通过MC命令行或管理界面)
// 然后实现一个服务监听这些事件并建立索引
java// 只获取前1KB数据
GetObjectArgs args = GetObjectArgs.builder()
.bucket("my-bucket")
.object("large-file.bin")
.offset(0L)
.length(1024L)
.build();
java// 仅在对象未被修改时获取
GetObjectArgs args = GetObjectArgs.builder()
.bucket("my-bucket")
.object("file.txt")
.matchETag("etag-value")
.build();
javaTags tags = minioClient.getObjectTags(
GetObjectTagsArgs.builder()
.bucket("my-bucket")
.object("file.txt")
.build());
虽然Minio不直接支持基于自定义元数据的查询,但通过上述方法组合,可以在Java应用中实现高效的元数据查询功能。对于生产环境,建议采用方法二(外部索引)以获得最佳性能。
本文作者:wucc
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!