|
|
@@ -0,0 +1,663 @@
|
|
|
+package cn.hfln.framework.minio.service;
|
|
|
+
|
|
|
+import cn.hfln.framework.minio.properties.MinioProperties;
|
|
|
+import com.google.common.io.ByteStreams;
|
|
|
+import io.minio.*;
|
|
|
+import io.minio.http.Method;
|
|
|
+import io.minio.messages.Item;
|
|
|
+import io.minio.messages.Tags;
|
|
|
+import lombok.SneakyThrows;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import javax.servlet.ServletOutputStream;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.ByteArrayInputStream;
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.nio.file.Files;
|
|
|
+import java.nio.file.Paths;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * MinIO对象相关操作
|
|
|
+ *
|
|
|
+ * @author yangliu
|
|
|
+ **/
|
|
|
+@Slf4j
|
|
|
+public class MinioObjectService {
|
|
|
+
|
|
|
+ private final MinioClient minioClient;
|
|
|
+
|
|
|
+ private String url;
|
|
|
+
|
|
|
+ private String defaultBucket;
|
|
|
+
|
|
|
+ public MinioObjectService(MinioClient minioClient) {
|
|
|
+ this.minioClient = minioClient;
|
|
|
+ }
|
|
|
+
|
|
|
+ public MinioObjectService(MinioClient minioClient, MinioProperties minIo) {
|
|
|
+ this.minioClient = minioClient;
|
|
|
+ this.url = minIo.getEndpoint() + ":" + minIo.getPort();
|
|
|
+ this.defaultBucket = minIo.getDefaultBucket();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void init() {
|
|
|
+ log.info("MinIoObjectService Init Success!");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-创建对象(文件夹or目录)
|
|
|
+ *
|
|
|
+ * @param folderName 对象id(存储名称)
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ObjectWriteResponse putObjectByFolder(String folderName) {
|
|
|
+ return putObjectByFolder(defaultBucket, folderName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-创建对象(文件夹or目录
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param folderName 对象id(存储名称)
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public ObjectWriteResponse putObjectByFolder(String bucketName, String folderName) {
|
|
|
+ return minioClient.putObject(
|
|
|
+ PutObjectArgs.builder().bucket(bucketName).object(folderName + "/").stream(new ByteArrayInputStream(new byte[]{}), 0, -1).build()
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-对象上传-本地对象路径
|
|
|
+ *
|
|
|
+ * @param objectName 对象id(存储名称)
|
|
|
+ * @param folderPath 本地对象路径
|
|
|
+ */
|
|
|
+ public void putObjectFolder(String objectName, String folderPath) {
|
|
|
+ putObjectFolder(defaultBucket, objectName, folderPath);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-对象上传-本地对象路径
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象id(存储名称)
|
|
|
+ * @param folderPath 本地对象路径
|
|
|
+ */
|
|
|
+ public void putObjectFolder(String bucketName, String objectName, String folderPath) {
|
|
|
+ if (Files.isDirectory(Paths.get(folderPath))) {
|
|
|
+ File dir = new File(folderPath);
|
|
|
+ dir.list();
|
|
|
+ uploadFolder(bucketName, objectName, dir);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-对象上传-本地对象路径
|
|
|
+ *
|
|
|
+ * @param objectName 对象id(存储名称)
|
|
|
+ * @param filename 本地对象路径
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ObjectWriteResponse putObject(String objectName, String filename) {
|
|
|
+ return putObject(defaultBucket, objectName, filename);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-对象上传-本地对象路径
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象id(存储名称)
|
|
|
+ * @param filename 本地对象路径
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public ObjectWriteResponse putObject(String bucketName, String objectName, String filename) {
|
|
|
+ return minioClient.uploadObject(
|
|
|
+ UploadObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .filename(filename)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-对象上传-multipartFile
|
|
|
+ * 单个对象的最大大小限制在5TB。putObject在对象大于5MiB时,自动使用multiple parts方式上传。这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。上传的对象使用MD5SUM签名进行完整性验证
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @param multipartFile 文件
|
|
|
+ * @return 文件永久访问地址
|
|
|
+ */
|
|
|
+ public String putObjectByMultipartFile(String objectName, MultipartFile multipartFile) {
|
|
|
+ putObjectByMultipartFile(defaultBucket, objectName, multipartFile);
|
|
|
+ return url + "/" + defaultBucket + "/" + objectName;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-对象上传-multipartFile
|
|
|
+ * 单个对象的最大大小限制在5TB。putObject在对象大于5MiB时,自动使用multiple parts方式上传。这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。上传的对象使用MD5SUM签名进行完整性验证
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @param multipartFile 文件
|
|
|
+ * @return 文件永久访问地址
|
|
|
+ */
|
|
|
+ public String putObjectByMultipartFile(String bucketName, String objectName, MultipartFile multipartFile) {
|
|
|
+ try (InputStream inputStream = multipartFile.getInputStream()) {
|
|
|
+ minioClient.putObject(PutObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .stream(inputStream, multipartFile.getSize(), -1)
|
|
|
+ .contentType(multipartFile.getContentType())
|
|
|
+ .build());
|
|
|
+ return url + "/" + defaultBucket + "/" + objectName;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("{}", e.getMessage(), e);
|
|
|
+ throw new RuntimeException(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-上传对象-InputStream
|
|
|
+ * 单个对象的最大大小限制在5TB。putObject在对象大于5MiB时,自动使用multiple parts方式上传。这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。上传的对象使用MD5SUM签名进行完整性验证
|
|
|
+ *
|
|
|
+ * @param objectName 对象名称
|
|
|
+ * @param stream 对象流
|
|
|
+ * @return 文件永久访问地址
|
|
|
+ */
|
|
|
+ public String putObject(String objectName, InputStream stream) {
|
|
|
+ putObject(defaultBucket, objectName, stream);
|
|
|
+ return url + "/" + defaultBucket + "/" + objectName;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-上传对象-InputStream
|
|
|
+ * 单个对象的最大大小限制在5TB。putObject在对象大于5MiB时,自动使用multiple parts方式上传。这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。上传的对象使用MD5SUM签名进行完整性验证
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象名称
|
|
|
+ * @param stream 对象流
|
|
|
+ * @return 文件永久访问地址
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public String putObject(String bucketName, String objectName, InputStream stream) {
|
|
|
+ minioClient.putObject(PutObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .stream(stream, stream.available(), -1)
|
|
|
+ .build());
|
|
|
+ stream.close();
|
|
|
+ return url + "/" + defaultBucket + "/" + objectName;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-上传对象-InputStream
|
|
|
+ *
|
|
|
+ * @param objectName 对象名称
|
|
|
+ * @param stream 对象流
|
|
|
+ * @param contentType 内容类型
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ObjectWriteResponse putObject(String objectName, InputStream stream, String contentType) {
|
|
|
+ return putObject(defaultBucket, objectName, stream, contentType);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-上传对象-InputStream
|
|
|
+ * 单个对象的最大大小限制在5TB。putObject在对象大于5MiB时,自动使用multiple parts方式上传。这样,当上传失败时,客户端只需要上传未成功的部分即可(类似断点上传)。上传的对象使用MD5SUM签名进行完整性验证
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象名称
|
|
|
+ * @param stream 对象流
|
|
|
+ * @param contentType 内容类型
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ObjectWriteResponse putObject(String bucketName, String objectName, InputStream stream, String contentType) {
|
|
|
+ try {
|
|
|
+ ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .stream(stream, stream.available(), -1)
|
|
|
+ .contentType(contentType)
|
|
|
+ .build());
|
|
|
+ return objectWriteResponse;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("{}", e.getMessage(), e);
|
|
|
+ throw new RuntimeException(e.getMessage());
|
|
|
+ } finally {
|
|
|
+ try {
|
|
|
+ stream.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取对象流
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public GetObjectResponse getObject(String objectName) {
|
|
|
+ return getObject(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取对象流
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public GetObjectResponse getObject(String bucketName, String objectName) {
|
|
|
+ return minioClient.getObject(
|
|
|
+ GetObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-对象下载-流-response方式
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ public void downloadObject(String objectName, HttpServletResponse response) {
|
|
|
+ downloadObject(defaultBucket, objectName, response);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-对象下载-流-response方式
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @param response
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public void downloadObject(String bucketName, String objectName, HttpServletResponse response) {
|
|
|
+ // 设置编码
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.setHeader("Content-Disposition", "attachment;objectName=" + URLEncoder.encode(objectName, "utf-8"));
|
|
|
+ ServletOutputStream os = response.getOutputStream();
|
|
|
+ GetObjectResponse is = minioClient.getObject(
|
|
|
+ GetObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build()
|
|
|
+ );
|
|
|
+ ByteStreams.copy(is, os);
|
|
|
+ os.flush();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-下载对象-下载到本服务器
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @param filename 对象存储位置
|
|
|
+ */
|
|
|
+ public void downloadObject(String objectName, String filename) {
|
|
|
+ downloadObject(defaultBucket, objectName, filename);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-下载对象-下载到本服务器
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @param filename 对象存储位置
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public void downloadObject(String bucketName, String objectName, String filename) {
|
|
|
+ minioClient.downloadObject(DownloadObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .filename(filename)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取对象信息和对象的元数据
|
|
|
+ * 如果不存在, 抛出异常
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public StatObjectResponse statObject(String objectName) {
|
|
|
+ return statObject(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取对象信息和对象的元数据
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public StatObjectResponse statObject(String bucketName, String objectName) {
|
|
|
+ return minioClient.statObject(StatObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取对象的元数据
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Map<String, String> getObjectUserMetadata(String objectName) {
|
|
|
+ return getObjectUserMetadata(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取对象的元数据
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public Map<String, String> getObjectUserMetadata(String bucketName, String objectName) {
|
|
|
+ return minioClient.statObject(StatObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build()).userMetadata();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取对象永久网址-URL
|
|
|
+ * 必须设置桶策略为可读(下载),只写权限,用户直接访问地址是查看不了的
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getObjectURL(String objectName) {
|
|
|
+ return getObjectURL(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取对象永久网址-URL
|
|
|
+ * 必须设置桶策略为可读(下载)。只写权限,用户直接访问地址无法查看
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getObjectURL(String bucketName, String objectName) {
|
|
|
+ statObject(bucketName, objectName);
|
|
|
+ return url + "/" + bucketName + "/" + objectName;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取预签名对象网址-URL
|
|
|
+ * 默认分享链接地址失效时间为7天
|
|
|
+ *
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getObjectShareLink(String objectName) {
|
|
|
+ return getObjectShareLink(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取预签名对象网址-URL
|
|
|
+ * 默认分享链接地址失效时间为7天
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public String getObjectShareLink(String bucketName, String objectName) {
|
|
|
+ return minioClient.getPresignedObjectUrl(
|
|
|
+ GetPresignedObjectUrlArgs.builder()
|
|
|
+ .method(Method.GET)
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取对象外链-url-自定义设置分享过期时间
|
|
|
+ * 设置有效期的分享链接(共享文件时间最大7天)。生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天
|
|
|
+ *
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @param expiry 失效时间(以秒为单位),默认是7天,不得大于七天
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getObjectShareLink(String objectName, int expiry) {
|
|
|
+ return getObjectShareLink(defaultBucket, objectName, expiry);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取对象外链-url-自定义设置分享过期时间
|
|
|
+ * 设置有效期的分享链接(共享文件时间最大7天)。生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @param expiry 失效时间(以秒为单位),默认是7天,不得大于七天
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public String getObjectShareLink(String bucketName, String objectName, int expiry) {
|
|
|
+ return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .method(Method.GET)
|
|
|
+ .expiry(expiry)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-根据对象前缀查询对象
|
|
|
+ *
|
|
|
+ * @param prefix 桶中对象的前缀 默认 空字符串
|
|
|
+ * @param recursive 是否递归子目录
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<Item> getAllObjectsByPrefix(String prefix, boolean recursive) {
|
|
|
+ return getAllObjectsByPrefix(defaultBucket, prefix, recursive);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-根据对象前缀查询对象
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param prefix 桶中对象的前缀 默认 空字符串
|
|
|
+ * @param recursive 是否递归子目录
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
|
|
|
+ List<Item> list = new ArrayList<>();
|
|
|
+ Iterable<Result<Item>> objectsIterator = minioClient.listObjects(ListObjectsArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .prefix(prefix)
|
|
|
+ .recursive(recursive)
|
|
|
+ .build());
|
|
|
+ if (objectsIterator != null) {
|
|
|
+ Iterator<Result<Item>> iterator = objectsIterator.iterator();
|
|
|
+ if (iterator != null) {
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ Result<Item> result = iterator.next();
|
|
|
+ Item item = result.get();
|
|
|
+ list.add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-通过复制已存在对象来创建对象
|
|
|
+ *
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @param source 已存在的源对象
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ObjectWriteResponse copyObject(String objectName, CopySource source) {
|
|
|
+ return copyObject(defaultBucket, objectName, source);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-通过服务器端从另一个对象复制数据来创建对象
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @param source 已存在的源对象
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public ObjectWriteResponse copyObject(String bucketName, String objectName, CopySource source) {
|
|
|
+ return minioClient.copyObject(
|
|
|
+ CopyObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .source(source)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-设置对象的标签
|
|
|
+ *
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @param tags 标签
|
|
|
+ */
|
|
|
+ public void setObjectTags(String objectName, Tags tags) {
|
|
|
+ setObjectTags(defaultBucket, objectName, tags);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-设置对象的标签
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @param tags 标签
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public void setObjectTags(String bucketName, String objectName, Tags tags) {
|
|
|
+ minioClient.setObjectTags(
|
|
|
+ SetObjectTagsArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .tags(tags).build());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-获取对象的标签
|
|
|
+ *
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ */
|
|
|
+ public void getObjectTags(String objectName) {
|
|
|
+ getObjectTags(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-获取对象的标签
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public Tags getObjectTags(String bucketName, String objectName) {
|
|
|
+ return minioClient.getObjectTags(
|
|
|
+ GetObjectTagsArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-删除对象标签
|
|
|
+ *
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ */
|
|
|
+ public void deleteObjectTags(String objectName) {
|
|
|
+ deleteObjectTags(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-删除对象标签
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public void deleteObjectTags(String bucketName, String objectName) {
|
|
|
+ minioClient.deleteObjectTags(
|
|
|
+ DeleteObjectTagsArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认桶-删除对象-单个
|
|
|
+ *
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ */
|
|
|
+ public void deleteObject(String objectName) {
|
|
|
+ deleteObject(defaultBucket, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 指定桶-删除对象-单个
|
|
|
+ *
|
|
|
+ * @param bucketName 桶名
|
|
|
+ * @param objectName 对象ID(存储桶里的对象名称)
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ public void deleteObject(String bucketName, String objectName) {
|
|
|
+ minioClient.removeObject(
|
|
|
+ RemoveObjectArgs.builder()
|
|
|
+ .bucket(bucketName)
|
|
|
+ .object(objectName)
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ @SneakyThrows
|
|
|
+ private void uploadFolder(String bucketName, String parentName, File file) {
|
|
|
+ for (File fileElem : Objects.requireNonNull(file.listFiles())) {
|
|
|
+ if (Files.isDirectory(Paths.get(fileElem.toURI()))) {
|
|
|
+ uploadFolder(bucketName, parentName + "/" + fileElem.getName(), fileElem);
|
|
|
+ } else {
|
|
|
+ putObject(bucketName, parentName + "/" + fileElem.getName(), fileElem.getAbsolutePath());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|