import com.alibaba.fastjson.JSONObject;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public class MinioUtil {
/**
* @param bucketName 桶名称
* @param expirationDay 连接时效性
* @param inputStream 文件流
* @param folderName 文件夹名称
* @param fileSuffix 文件后缀名
* @Description: 上传文件
*/
public static JSONObject uploadFile(MinioClient minioClient, String bucketName, String expirationDay, InputStream inputStream,
String contentType, String folderName, String fileSuffix, String minioOpenSoueces) throws Exception {
return upload(minioClient, bucketName, expirationDay, inputStream, folderName, fileSuffix, contentType, minioOpenSoueces);
}
/**
* @param bucketName 桶名称
* @param expirationDay 连接时效性
* @param str 长文本
* @param folderName 文件夹名称
* @Description: 上传字符串大文本内容
*/
public static JSONObject uploadString(MinioClient minioClient, String bucketName, String expirationDay,
String str, String folderName, String minioOpenSoueces) throws Exception {
if (StringUtils.isEmpty(str)) {
return new JSONObject();
}
InputStream inputStream = new ByteArrayInputStream(str.getBytes());
return upload(minioClient, bucketName, expirationDay, inputStream, folderName, null, "text/html", minioOpenSoueces);
}
/**
* @param bucketName 桶名称
* @param expirationDay 连接时效性
* @param inputStream 文件流
* @param folderName 文件夹名称
* @param fileSuffix 文件后缀名
* @Description: 上传主功能
*/
private static JSONObject upload(MinioClient minioClient, String bucketName, String expirationDay, InputStream inputStream,
String folderName, String fileSuffix, String contentType, String minioOpenSoueces) throws Exception {
JSONObject map = new JSONObject();
// 验证名称为bucketName的bucket是否存在,不存在则创建
if (!minioClient.bucketExists(bucketName)) {
minioClient.makeBucket(bucketName);
}
if (!StringUtils.isBlank(minioOpenSoueces)) {
List<String> list = Arrays.asList(minioOpenSoueces.split(","));
setBucketPolicy(minioClient, bucketName, list);
}
String fileName = UUID.randomUUID().toString() + "." + fileSuffix;
//不确定文件大小传-1
long objectSize = -1L;
//最大上传限制5G
long partSize = 5368709120L;
PutObjectOptions options = new PutObjectOptions(objectSize, partSize);
options.setContentType(contentType);
minioClient.putObject(bucketName, folderName + "/" + fileName, inputStream, options);
String url = getMinioUrl(minioClient, bucketName, expirationDay, folderName, fileName, minioOpenSoueces);
map.put("flag", "0");
map.put("mess", "上传成功");
map.put("url", url);
map.put("path", folderName + "/" + fileName);
return map;
}
/**
* @param bucketName 桶名称
* @param expirationDay 连接时效性
* @param folderName 文件夹名称
* @param fileName 文件名
*/
public static String getMinioUrl(MinioClient minioClient, String bucketName, String expirationDay,
String folderName, String fileName, String minioOpenSoueces) throws Exception {
int parseInt = Integer.parseInt(expirationDay);
int seconds = 60 * 60 * 24 * parseInt;
boolean isopen = false;
if (!StringUtils.isBlank(minioOpenSoueces)) {
for (String openPath : minioOpenSoueces.split(",")) {
if (folderName.contains(openPath)) {
isopen = true;
break;
}
}
}
if (isopen) {
return minioClient.getObjectUrl(bucketName, folderName + "/" + fileName);
}
return minioClient.presignedGetObject(bucketName, folderName + "/" + fileName, seconds);
}
private static void setBucketPolicy(MinioClient minioClient, String bucketName, List<String> openPaths) throws Exception {
StringBuilder openUrl = new StringBuilder();
for (String string : openPaths) {
openUrl.append(" \"arn:aws:s3:::").append(bucketName).append("/").append(string).append("*\",\n");
}
String substring = openUrl.substring(0, openUrl.lastIndexOf(",")) + "\n";
String policy = "{\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": [\n" +
" \"s3:GetBucketLocation\"\n" +
" ],\n" +
" \"Effect\": \"Allow\",\n" +
" \"Principal\": \"*\",\n" +
" \"Resource\": \"arn:aws:s3:::" + bucketName + "\"\n" +
" },\n" +
" {\n" +
" \"Action\": \"s3:GetObject\",\n" +
" \"Effect\": \"Allow\",\n" +
" \"Principal\": \"*\",\n" +
" \"Resource\": [\n" +
substring +
" ]\n" +
" }\n" +
" ],\n" +
" \"Version\": \"2012-10-17\"\n" +
"}\n";
minioClient.setBucketPolicy(bucketName, policy);
}
}
21.Minio文件下载工具类
最新推荐文章于 2025-04-28 15:58:15 发布