import cn.hutool.crypto.digest.MD5;
import io.minio.MinioClient;
import io.minio.policy.PolicyType;
import org.springframework.web.multipart.MultipartFile;
import java.util.Objects;
/**
* minio 相关的工具方法
* @author RondoChan
* @date 2022/9/30 14:18
*/
public class MinioUtil {
/**
*
* @param minioEndpoint minio 服务器地址
* @param minioAccessKey accessKey
* @param minioSecretKey secretKey
* @param minioBucketName 桶名称
* @param file 要上传的文件
* @return 上传后文件的 url
* @throws Exception 可能会上传失败
*/
public static String uploadFile2Minio(String minioEndpoint, String minioAccessKey, String minioSecretKey,String minioBucketName,MultipartFile file) throws Exception {
String[] split = Objects.requireNonNull(file.getOriginalFilename()).split("\\.");
String type = split.length == 2 ? split[1] : "";
return uploadFile2Minio(minioEndpoint, minioAccessKey, minioSecretKey,minioBucketName,file, type);
}
/**
* 上传文件到 minio
*
* @param file 上传的文件
* @param type 文件后缀
* @return 上传文件储存在 minio 服务器的 url
*/
public static String uploadFile2Minio(String minioEndpoint, String minioAccessKey, String minioSecretKey,String minioBucketName,MultipartFile file, String type) throws Exception {
MinioClient client = new MinioClient(minioEndpoint, minioAccessKey, minioSecretKey);
if (!client.bucketExists(minioBucketName)) {
client.makeBucket(minioBucketName);
client.setBucketPolicy(minioBucketName, "*.*", PolicyType.READ_ONLY);
}
// 根据文件流创建文件名称,防止文件内容相同时重复上传
String objectName = MD5.create().digestHex(file.getInputStream()) + "." + type;
// 不重复上传,奇怪,居然没有提供判断文件是否存在的 api
try {
client.statObject(minioBucketName, objectName);
} catch (Exception e) {
client.putObject(minioBucketName, objectName, file.getInputStream(), file.getContentType());
}
return minioEndpoint + "/" + minioBucketName + "/" + objectName;
}
}
网友评论