更新Minio

This commit is contained in:
dftre 2024-09-27 19:12:47 +08:00
parent be168e54b7
commit d2776a6b1e
12 changed files with 337 additions and 436 deletions

2
.gitignore vendored
View File

@ -46,3 +46,5 @@ nbdist/
!*/build/*.java !*/build/*.java
!*/build/*.html !*/build/*.html
!*/build/*.xml !*/build/*.xml
effective-pom.xml

View File

@ -25,11 +25,17 @@ spring:
# Minio配置 # Minio配置
minio: minio:
enable: false enable: true
downLoadLimit: 1024 downLoadLimit: 1024
primary: MASTER
client: client:
master: MASTER:
url: http://localhost:9000 url: http://192.168.3.13:9000
accessKey: accessKey:
secretKey: secretKey:
defaultBuket: buketName: plaform
SLAVE:
url: http://192.168.3.13:9000
accessKey:
secretKey:
buketName: plaform

View File

@ -13,7 +13,7 @@ ruoyi:
# 验证码类型 math 数组计算 char 字符验证 # 验证码类型 math 数组计算 char 字符验证
captchaType: math captchaType: math
# 指定默认文件服务类型(值为disk代表使用磁盘作为文件操作服务,minio代表使用minio作为文件操作服务) # 指定默认文件服务类型(值为disk代表使用磁盘作为文件操作服务,minio代表使用minio作为文件操作服务)
fileServer: disk fileServer: minio
# 开发环境配置 # 开发环境配置
server: server:

View File

@ -33,6 +33,8 @@ public class MimeTypeUtils
"doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
// 压缩文件 // 压缩文件
"rar", "zip", "gz", "bz2", "rar", "zip", "gz", "bz2",
// 音频格式
"mp3", "wav",
// 视频格式 // 视频格式
"mp4", "avi", "rmvb", "mp4", "avi", "rmvb",
// pdf // pdf

View File

@ -1,103 +0,0 @@
package com.ruoyi.middleware.minio.config;
import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@ConfigurationProperties("minio.client")
public class MinioClientConfig {
public MinioClientEntity getMaster() {
return master;
}
public void setMaster(MinioClientEntity master) {
this.master = master;
}
public List<MinioClientEntity> getSlave() {
return slave;
}
public void setSlave(List<MinioClientEntity> slave) {
this.slave = slave;
}
private MinioClientEntity master;
private List<MinioClientEntity> slave = new ArrayList<>();
public static class MinioClientEntity {
private String url;
private String accessKey;
private String secretKey;
private String name;
private String defaultBuket;
private MinioClient client;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDefaultBuket() {
return defaultBuket;
}
public void setDefaultBuket(String defaultBuket) {
this.defaultBuket = defaultBuket;
}
public MinioClient getClient() {
return client;
}
public void setClient(MinioClient client) {
this.client = client;
}
public MinioClientEntity(String url, String accessKey, String secretKey, String name, String defaultBuket) {
this.url = url;
this.accessKey = accessKey;
this.secretKey = secretKey;
this.name = name;
this.defaultBuket = defaultBuket;
}
public MinioClientEntity() {
}
}
}

View File

@ -0,0 +1,62 @@
package com.ruoyi.middleware.minio.config;
import io.minio.MinioClient;
public class MinioClientProperties {
private String url;
private String accessKey;
private String secretKey;
private String buketName;
private MinioClient client;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getBuketName() {
return buketName;
}
public void setBuketName(String buketName) {
this.buketName = buketName;
}
public MinioClient getClient() {
return client;
}
public void setClient(MinioClient client) {
this.client = client;
}
public MinioClientProperties(String url, String accessKey, String secretKey, String buketName) {
this.url = url;
this.accessKey = accessKey;
this.secretKey = secretKey;
this.buketName = buketName;
}
public MinioClientProperties() {
}
}

View File

@ -1,109 +1,106 @@
package com.ruoyi.middleware.minio.config; package com.ruoyi.middleware.minio.config;
import java.util.List; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.http.impl.io.EmptyInputStream; import org.apache.http.impl.io.EmptyInputStream;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.middleware.minio.domain.MinioBucket;
import io.minio.BucketExistsArgs; import io.minio.BucketExistsArgs;
import io.minio.MinioClient; import io.minio.MinioClient;
import io.minio.PutObjectArgs; import io.minio.PutObjectArgs;
import jakarta.annotation.PostConstruct;
@Configuration("MinioConfiguration") @Configuration("MinioConfiguration")
@ConditionalOnProperty(prefix = "minio", name = { "enable" }, havingValue = "true", matchIfMissing = false) @ConditionalOnProperty(prefix = "minio", name = { "enable" }, havingValue = "true", matchIfMissing = false)
public class MinioConfig { @ConfigurationProperties("minio")
public class MinioConfig implements InitializingBean {
public int maxSize; public static int maxSize;
private String prefix = "/minio";
private Map<String, MinioClientProperties> client;
private String primary;
private Map<String, MinioBucket> targetMinioBucket = new HashMap<>();
private MinioBucket masterBucket;
public static String prefix = "/minio"; @Override
@Autowired public void afterPropertiesSet() throws Exception {
private MinioClientConfig minioClientConfig; client.forEach((name, props) -> targetMinioBucket.put(name, createMinioClient(name, props)));
if (targetMinioBucket.get(primary) == null) {
throw new RuntimeException("Primary client " + primary + " does not exist");
}
masterBucket = targetMinioBucket.get(primary);
}
private Map<String, MinioClientConfig.MinioClientEntity> slaveClients = new ConcurrentHashMap<>(); private MinioBucket createMinioClient(String name, MinioClientProperties props) {
MinioClient client;
private List<MinioClientConfig.MinioClientEntity> slaveClientsList = new CopyOnWriteArrayList<>(); if (StringUtils.isEmpty(props.getAccessKey())) {
client = MinioClient.builder()
private MinioClientConfig.MinioClientEntity masterClient; .endpoint(props.getUrl())
.build();
@PostConstruct } else {
public void init() { client = MinioClient.builder()
List<MinioClientConfig.MinioClientEntity> collect = minioClientConfig.getSlave().stream().map(item -> { .endpoint(props.getUrl())
setClient(item); .credentials(props.getAccessKey(), props.getSecretKey())
isBuketExistOnAnonymous(item); .build();
return item; }
}).toList(); BucketExistsArgs bucketExistArgs = BucketExistsArgs.builder().bucket(props.getBuketName()).build();
collect.forEach(item -> { boolean b = false;
slaveClients.put(item.getName(), item); try {
slaveClientsList.add(item); b = client.bucketExists(bucketExistArgs);
}); PutObjectArgs putObjectArgs = PutObjectArgs.builder()
MinioClientConfig.MinioClientEntity master = minioClientConfig.getMaster(); .object(FileUtils.getRelativePath(RuoYiConfig.getProfile()) + "/")
setClient(master); .stream(EmptyInputStream.nullInputStream(), 0, -1).bucket(props.getBuketName()).build();
isBuketExistOnAnonymous(master); client.putObject(putObjectArgs);
masterClient = master; } catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
if (!b) {
throw new RuntimeException("Bucket " + props.getBuketName() + " does not exist");
}
return new MinioBucket(client, props.getBuketName());
} }
public int getMaxSize() { public int getMaxSize() {
return maxSize; return maxSize;
} }
public List<MinioClientConfig.MinioClientEntity> getSlaveClientsList() { public MinioBucket getMasterBucket() {
return slaveClientsList; return this.masterBucket;
} }
public Map<String, MinioClientConfig.MinioClientEntity> getSlaveClients() { public MinioBucket getBucket(String clent) {
return this.slaveClients; return targetMinioBucket.get(clent);
} }
public MinioClientConfig.MinioClientEntity getMasterClient() { public Map<String, MinioClientProperties> getClient() {
return this.masterClient; return client;
} }
private static void setClient(MinioClientConfig.MinioClientEntity entity){ public void setClient(Map<String, MinioClientProperties> client) {
if (StringUtils.isEmpty(entity.getAccessKey())){ this.client = client;
MinioClient build = MinioClient.builder().endpoint(entity.getUrl()).build();
entity.setClient(build);
}else {
MinioClient build = MinioClient.builder().endpoint(entity.getUrl())
.credentials(entity.getAccessKey(), entity.getSecretKey()).build();
entity.setClient(build);
BucketExistsArgs bucketExistArgs = BucketExistsArgs.builder().bucket(entity.getDefaultBuket()).build();
try {
boolean b = entity.getClient().bucketExists(bucketExistArgs);
if (!b){
throw new RuntimeException("defaultBucket does not exist");
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
entity.setClient(build);
}
} }
public String getPrimary() {
private static void isBuketExistOnAnonymous(MinioClientConfig.MinioClientEntity entity) { return primary;
try {
String defaultBuket = entity.getDefaultBuket();
if(StringUtils.isEmpty(defaultBuket)){
throw new RuntimeException("defaultBuket without a default value ");
}
PutObjectArgs putObjectArgs= PutObjectArgs.builder().object(FileUtils.getRelativePath(RuoYiConfig.getProfile())+ "/")
.stream(EmptyInputStream.nullInputStream(),0,-1).bucket(entity.getDefaultBuket()).build();
entity.getClient().putObject(putObjectArgs);
}catch (Exception e){
throw new RuntimeException(e);
}
} }
public void setPrimary(String primary) {
this.primary = primary;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
} }

View File

@ -2,9 +2,12 @@ package com.ruoyi.middleware.minio.controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
@ -20,28 +23,22 @@ import okhttp3.Headers;
@RequestMapping("/minio") @RequestMapping("/minio")
public class MinioController { public class MinioController {
@GetMapping("/{client}")
@GetMapping("/{buketName}")
@Anonymous @Anonymous
public void downLoadFile(HttpServletRequest request, HttpServletResponse response, public void downLoadFile(HttpServletRequest request, HttpServletResponse response,
@PathVariable("buketName") String buketName, @PathVariable("client") String client,
@RequestParam("fileName") String fileName, @RequestParam("fileName") String fileName) throws Exception {
@RequestParam(value = "clientName", required = false) String clientName) throws Exception { MinioFileVO file = MinioUtil.getFile(client, fileName);
Headers headers = file.getHeaders();
String contentType = headers.get("content-Type");
response.setContentType(contentType);
FileUtils.writeBytes(file.getFileInputSteam(), response.getOutputStream());
}
if (!StringUtils.isEmpty(clientName)) { @PutMapping("/{client}")
MinioFileVO file = MinioUtil.SlaveClient.getFile(clientName, buketName, fileName); @Anonymous
Headers headers = file.getHeaders(); public String uploadFile(HttpServletRequest request, HttpServletResponse response,
@PathVariable("client") String client, @RequestBody MultipartFile file) throws Exception {
String contentType = headers.get("content-Type"); return MinioUtil.uploadFile(client, file);
response.setContentType(contentType);
FileUtils.writeBytes(file.getFileInputSteam(), response.getOutputStream());
} else {
MinioFileVO file = MinioUtil.getFile(buketName, fileName);
Headers headers = file.getHeaders();
String contentType = headers.get("content-Type");
response.setContentType(contentType);
FileUtils.writeBytes(file.getFileInputSteam(), response.getOutputStream());
}
} }
} }

View File

@ -0,0 +1,111 @@
package com.ruoyi.middleware.minio.domain;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.middleware.minio.config.MinioConfig;
import com.ruoyi.middleware.minio.exception.MinioClientErrorException;
import io.minio.GetObjectArgs;
import io.minio.GetObjectResponse;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import com.ruoyi.common.exception.file.FileException;
public class MinioBucket {
private MinioClient client;
private String buketName;
public MinioBucket() {
}
public MinioBucket(MinioClient client, String buketName) {
this.client = client;
this.buketName = buketName;
}
public String getName() {
return buketName;
}
public MinioClient getClient() {
return client;
}
public String getBuketName() {
return buketName;
}
public void setBuketName(String buketName) {
this.buketName = buketName;
}
public void setClient(MinioClient client) {
this.client = client;
}
public void put(String fileName, MultipartFile file) throws Exception {
put(fileName, file.getContentType(), file.getInputStream());
}
public void put(String filePath, String contentType, InputStream inputStream) throws Exception {
PutObjectArgs build = PutObjectArgs.builder().contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.bucket(this.buketName).object(filePath).build();
put(build);
}
public void put(PutObjectArgs putObjectArgs) throws Exception {
try {
this.client.putObject(putObjectArgs);
} catch (Exception e) {
throw new MinioClientErrorException(e.getMessage());
}
}
public void remove(String filePath) throws Exception {
RemoveObjectArgs build = RemoveObjectArgs.builder().object(filePath).bucket(buketName).build();
remove(build);
}
public void remove(RemoveObjectArgs removeObjectArgs) throws Exception {
this.client.removeObject(removeObjectArgs);
}
public MinioFileVO get(GetObjectArgs getObjectArgs) throws Exception {
GetObjectResponse inputStream = this.client.getObject(getObjectArgs);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[MinioConfig.maxSize];
int length = 0;
while (true) {
try {
if (!((length = inputStream.read(bytes, 0, bytes.length)) > 0)) {
break;
}
} catch (Exception e) {
throw new FileException("500", new String[] { e.getMessage() });
}
byteArrayOutputStream.write(bytes, 0, length);
}
return new MinioFileVO(inputStream, inputStream.object(), inputStream.headers(), inputStream.bucket(),
inputStream.region());
}
/**
* 文件下载
*
* @param buketName Minio的桶名
* @param filePath 文件路径
* @return 返回封装的Minio下载文件对象
* @throws IOException 比如读写文件出错时
*/
public MinioFileVO get(String filePath) throws Exception {
GetObjectArgs build = GetObjectArgs.builder().object(filePath).bucket(buketName).build();
return get(build);
}
}

View File

@ -1,18 +1,19 @@
package com.ruoyi.middleware.minio.domain; package com.ruoyi.middleware.minio.domain;
import okhttp3.Headers; import okhttp3.Headers;
import java.io.InputStream; import java.io.InputStream;
public class MinioFileVO { public class MinioFileVO {
private InputStream fileInputSteam; private InputStream fileInputSteam;
private String object; private String object;
private Headers headers; private Headers headers;
private String buket; private String buket;
private String region; private String region;
public MinioFileVO() {
}
public InputStream getFileInputSteam() { public InputStream getFileInputSteam() {
return fileInputSteam; return fileInputSteam;
} }
@ -21,7 +22,6 @@ public class MinioFileVO {
this.fileInputSteam = fileInputSteam; this.fileInputSteam = fileInputSteam;
} }
public String getObject() { public String getObject() {
return object; return object;
} }
@ -62,7 +62,4 @@ public class MinioFileVO {
this.region = region; this.region = region;
} }
public MinioFileVO() {
}
} }

View File

@ -1,4 +1,4 @@
package com.ruoyi.middleware.minio.utils; package com.ruoyi.middleware.minio.service;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
@ -16,8 +16,7 @@ import com.ruoyi.common.utils.file.FileService;
import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.middleware.minio.config.MinioConfig; import com.ruoyi.middleware.minio.config.MinioConfig;
import com.ruoyi.middleware.minio.domain.MinioFileVO; import com.ruoyi.middleware.minio.domain.MinioFileVO;
import com.ruoyi.middleware.minio.utils.MinioUtil;
import static com.ruoyi.common.utils.file.FileUtils.getPathFileName;
/** /**
* Minio文件操作实现类 * Minio文件操作实现类
@ -37,12 +36,12 @@ public class MinioFileService implements FileService {
relativePath = filePath; relativePath = filePath;
} }
return MinioUtil.uploadFile(minioConfig.getMasterClient().getDefaultBuket(), relativePath, file); return MinioUtil.uploadFile(minioConfig.getPrimary(), relativePath, file);
} }
@Override @Override
public String upload(MultipartFile file, String name) throws Exception { public String upload(MultipartFile file, String name) throws Exception {
return MinioUtil.uploadFile(minioConfig.getMasterClient().getDefaultBuket(), name, file); return MinioUtil.uploadFile(minioConfig.getPrimary(), name, file);
} }
@Override @Override
@ -53,21 +52,20 @@ public class MinioFileService implements FileService {
@Override @Override
public String upload(String baseDir, String fileName, MultipartFile file) throws Exception { public String upload(String baseDir, String fileName, MultipartFile file) throws Exception {
return upload(baseDir + File.pathSeparator + fileName, file); return upload(baseDir + File.pathSeparator + fileName, file);
} }
@Override @Override
public InputStream downLoad(String fileUrl) throws Exception { public InputStream downLoad(String fileUrl) throws Exception {
String filePath = StringUtils.substringAfter(fileUrl, "?fileName="); String filePath = StringUtils.substringAfter(fileUrl, "?fileName=");
MinioFileVO file = MinioUtil.getFile(minioConfig.getMasterClient().getDefaultBuket(), filePath); MinioFileVO file = MinioUtil.getFile(minioConfig.getPrimary(), filePath);
return file.getFileInputSteam(); return file.getFileInputSteam();
} }
@Override @Override
public boolean deleteFile(String fileUrl) throws Exception { public boolean deleteFile(String fileUrl) throws Exception {
String filePath = StringUtils.substringAfter(fileUrl, "?fileName="); String filePath = StringUtils.substringAfter(fileUrl, "?fileName=");
MinioUtil.removeFile(minioConfig.getMasterClient().getDefaultBuket(), filePath); MinioUtil.removeFile(minioConfig.getPrimary(), filePath);
FileOperateUtils.deleteFileAndMd5ByFilePath(filePath); FileOperateUtils.deleteFileAndMd5ByFilePath(filePath);
return true; return true;
} }

View File

@ -1,29 +1,15 @@
package com.ruoyi.middleware.minio.utils; package com.ruoyi.middleware.minio.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.exception.file.FileException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.UUID; import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.middleware.minio.config.MinioClientConfig;
import com.ruoyi.middleware.minio.config.MinioConfig; import com.ruoyi.middleware.minio.config.MinioConfig;
import com.ruoyi.middleware.minio.domain.MinioFileVO; import com.ruoyi.middleware.minio.domain.MinioFileVO;
import com.ruoyi.middleware.minio.exception.MinioClientErrorException; import com.ruoyi.middleware.minio.exception.MinioClientErrorException;
import io.minio.GetObjectArgs;
import io.minio.GetObjectResponse;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import io.minio.RemoveObjectsArgs;
import io.minio.Result;
import io.minio.messages.DeleteError;
/** /**
* Minio工具 * Minio工具
* *
@ -34,7 +20,7 @@ public class MinioUtil {
private static MinioConfig getMinioConfig() { private static MinioConfig getMinioConfig() {
if (minioConfig == null) { if (minioConfig == null) {
synchronized (MinioFileService.class) { synchronized (MinioUtil.class) {
if (minioConfig == null) { if (minioConfig == null) {
minioConfig = SpringUtils.getBean(MinioConfig.class); minioConfig = SpringUtils.getBean(MinioConfig.class);
} }
@ -46,73 +32,17 @@ public class MinioUtil {
/** /**
* 文件上传 * 文件上传
* *
* @param buketName Minio的桶名 * @param buketName Minio的桶名
* @param filePath 上传的文件路径 * @param file 上传的文件
* @param contentType 上传文件类型 * @return 返回上传成功的文件名
* @param inputStream 上传文件的输入流
* @return 返回上传成功的文路径
* @throws IOException 比如读写文件出错时 * @throws IOException 比如读写文件出错时
*
*/ */
public static String uploadFile(String buketName, String filePath, public static String uploadFile(String client, MultipartFile file) throws Exception {
String contentType, InputStream inputStream) String fileName = DateUtils.dateTimeNow() + UUID.fastUUID().toString().substring(0, 5) + "."
throws Exception { + FileUtils.getExtension(file);
PutObjectArgs build = PutObjectArgs.builder().contentType(contentType) return uploadFile(client, fileName, file);
.stream(inputStream, inputStream.available(), -1)
.bucket(buketName).object(filePath).build();
return uploadFile(build);
} }
/**
* 文件上传
*
* @param putObjectArgs Minio上传参数
* @return 返回上传成功的文件路径
*/
public static String uploadFile(PutObjectArgs putObjectArgs) throws Exception {
try {
MinioClientConfig.MinioClientEntity masterClient = getMinioConfig().getMasterClient();
masterClient.getClient().putObject(putObjectArgs);
StringBuilder url = new StringBuilder();
url.append(MinioConfig.prefix).append("/").append(masterClient.getDefaultBuket())
// .append("/").append(filePath)
.append("?").append("fileName=").append(putObjectArgs.object());
return url.toString();
} catch (Exception e) {
throw new MinioClientErrorException(e.getMessage());
}
}
/**
* 文件上传(从节点递归直到上传成功)
*
* @param index 开始递归的从节点索引
* @param putObjectArgs Minio上传文件参数
* @return 返回上传成功的文件路径
*/
// private static String uploadFileIterator(int index, PutObjectArgs putObjectArgs) {
// List<MinioClientConfig.MinioClientEntity> slaveClientsList = getMinioConfig().getSlaveClientsList();
// if (index >= slaveClientsList.size()) {
// throw new MinioClientNotFundException();
// }
// try {
// MinioClientConfig.MinioClientEntity minioClientEntity = slaveClientsList.get(index);
// PutObjectArgs build = PutObjectArgs.builder().contentType(putObjectArgs.contentType())
// .object(putObjectArgs.object())
// .stream(putObjectArgs.stream(), putObjectArgs.stream().available(), -1)
// .bucket(minioClientEntity.getDefaultBuket()).build();
// minioClientEntity.getClient().putObject(build);
// StringBuilder url = new StringBuilder();
// url.append(MinioConfig.prefix).append("/").append(minioClientEntity.getDefaultBuket())
// .append("?").append("fileName=").append(putObjectArgs.object())
// .append("&").append("clientName=").append(minioClientEntity.getName());
// return url.toString();
// } catch (Exception e) {
// return uploadFileIterator(index + 1, putObjectArgs);
// }
// }
/** /**
* 文件上传 * 文件上传
* *
@ -122,169 +52,71 @@ public class MinioUtil {
* @return 返回上传成功的文件名 * @return 返回上传成功的文件名
* @throws IOException 比如读写文件出错时 * @throws IOException 比如读写文件出错时
*/ */
public static String uploadFile(String buketName, String fileName, MultipartFile file) throws Exception { public static String uploadFile(String client, String fileName, MultipartFile file) throws Exception {
return uploadFile(buketName, fileName, file.getContentType(), file.getInputStream()); getMinioConfig().getBucket(client).put(fileName, file);
return getURL(client, fileName);
} }
/** /**
* 文件上传 * 文件上传
* *
* @param buketName Minio的桶名 * @param filePath 文件路径
* @param file 上传的文件 * @return 返回上传成功的文件路径
* @return 返回上传成功的文件名
* @throws IOException 比如读写文件出错时
*/ */
public static String uploadFile(String buketName, MultipartFile file) throws Exception { public static String getURL(String client, String filePath) throws Exception {
String fileName = DateUtils.dateTimeNow() + UUID.fastUUID().toString().substring(0, 5) + "." try {
+ FileUtils.getExtension(file); StringBuilder url = new StringBuilder();
url.append(getMinioConfig().getPrefix()).append("/").append(client)
return uploadFile(buketName, fileName, file.getContentType(), file.getInputStream()); .append("?").append("fileName=").append(filePath);
} return url.toString();
} catch (Exception e) {
/** throw new MinioClientErrorException(e.getMessage());
* 文件删除
*
* @param removeObjectArgs Minio删除文件的参数对象
* @throws IOException 比如读写文件出错时
*/
public static void removeFile(RemoveObjectArgs removeObjectArgs) throws Exception {
getMinioConfig().getMasterClient().getClient().removeObject(removeObjectArgs);
}
/**
* 文件删除
*
* @param buketName Minio的桶名
* @param filePath 上传文件路径
* @throws IOException 比如读写文件出错时
*/
public static void removeFile(String buketName, String filePath) throws Exception {
RemoveObjectArgs build = RemoveObjectArgs.builder().object(filePath).bucket(buketName).build();
removeFile(build);
}
/**
* 文件批量删除
*
* @param removeObjectsArgs Minio批量删除文件参数对象
* @return 删除结果
* @throws IOException 比如读写文件出错时
*/
public static Iterable<Result<DeleteError>> removeFiles(RemoveObjectsArgs removeObjectsArgs) {
return getMinioConfig().getMasterClient().getClient().removeObjects(removeObjectsArgs);
}
/**
* 文件下载
*
* @param getObjectArgs Minio获取文件参数对象
* @return 返回封装的Minio下载结果对象
* @throws IOException 比如读写文件出错时
*/
public static MinioFileVO getFile(GetObjectArgs getObjectArgs) throws Exception {
GetObjectResponse inputStream = getMinioConfig().getMasterClient().getClient().getObject(getObjectArgs);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[getMinioConfig().maxSize];
int length = 0;
while (true) {
try {
if (!((length = inputStream.read(bytes, 0, bytes.length)) > 0)) {
break;
}
} catch (Exception e) {
throw new FileException("500", new String[] { e.getMessage() });
}
byteArrayOutputStream.write(bytes, 0, length);
} }
return new MinioFileVO(inputStream, inputStream.object(), inputStream.headers(), inputStream.bucket(),
inputStream.region()); }
/**
* 文件删除
*
* @param filePath 上传文件路径
* @throws IOException 比如读写文件出错时
*/
public static void removeFile(String filePath) throws Exception {
getMinioConfig().getMasterBucket().remove(filePath);
}
/**
* 文件删除
*
* @param client 连接名
* @param filePath 上传文件路径
* @throws IOException 比如读写文件出错时
*/
public static void removeFile(String client, String filePath) throws Exception {
getMinioConfig().getBucket(client).remove(filePath);
} }
/** /**
* 文件下载 * 文件下载
* *
* @param buketName Minio的桶名 * @param filePath 文件路径
* @param filePath 文件路径
* @return 返回封装的Minio下载文件对象 * @return 返回封装的Minio下载文件对象
* @throws IOException 比如读写文件出错时 * @throws IOException 比如读写文件出错时
*/ */
public static MinioFileVO getFile(String buketName, String filePath) throws Exception { public static MinioFileVO getFile(String filePath) throws Exception {
GetObjectArgs build = GetObjectArgs.builder().object(filePath).bucket(buketName).build(); return getMinioConfig().getMasterBucket().get(filePath);
return getFile(build);
} }
/** /**
* 从节点对应操作工具类 * 文件下载
*
* @param client 连接名
* @param filePath 文件路径
* @return 返回封装的Minio下载文件对象
* @throws IOException 比如读写文件出错时
*/ */
public static class SlaveClient { public static MinioFileVO getFile(String client, String filePath) throws Exception {
public static String uploadFile(String clientName, String buketName, String fileName, return getMinioConfig().getBucket(client).get(filePath);
String contentType, InputStream inputStream)
throws Exception {
PutObjectArgs build = PutObjectArgs.builder().contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.bucket(buketName).object(fileName).build();
return uploadFile(clientName, build);
}
public static String uploadFile(String clientName, PutObjectArgs putObjectArgs) throws Exception {
MinioClientConfig.MinioClientEntity minioClientEntity = getMinioConfig().getSlaveClients().get(clientName);
minioClientEntity.getClient().putObject(putObjectArgs);
StringBuilder url = new StringBuilder();
url.append(MinioConfig.prefix).append("/").append(minioClientEntity.getDefaultBuket())
.append("?").append("fileName=").append(putObjectArgs.object())
.append("&").append("clientName=").append(minioClientEntity.getName());
return url.toString();
}
public static String uploadFile(String clientName, String buketName, String fileName, MultipartFile file)
throws Exception {
return uploadFile(clientName, buketName, fileName, file.getContentType(), file.getInputStream());
}
public static String uploadFile(String clientName, String buketName, MultipartFile file) throws Exception {
String fileName = DateUtils.dateTimeNow() + UUID.fastUUID().toString().substring(0, 5);
return uploadFile(clientName, buketName, fileName, file.getContentType(), file.getInputStream());
}
public static void removeFile(String clientName, RemoveObjectArgs removeObjectArgs) throws Exception {
getMinioConfig().getSlaveClients().get(clientName).getClient().removeObject(removeObjectArgs);
}
public static void removeFile(String clientName, String buketName, String fileName) throws Exception {
RemoveObjectArgs build = RemoveObjectArgs.builder().object(fileName).bucket(buketName).build();
removeFile(clientName, build);
}
public static Iterable<Result<DeleteError>> removeFiles(RemoveObjectsArgs removeObjectsArgs) {
return getMinioConfig().getMasterClient().getClient().removeObjects(removeObjectsArgs);
}
public static MinioFileVO getFile(String clientName, GetObjectArgs getObjectArgs) throws Exception {
GetObjectResponse inputStream = getMinioConfig().getSlaveClients().get(clientName).getClient()
.getObject(getObjectArgs);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[getMinioConfig().maxSize];
int length = 0;
while (true) {
try {
if (!((length = inputStream.read(bytes, 0, bytes.length)) > 0)) {
break;
}
} catch (Exception e) {
throw new FileException("500", new String[] { e.getMessage() });
}
byteArrayOutputStream.write(bytes, 0, length);
}
return new MinioFileVO(inputStream, inputStream.object(), inputStream.headers(), inputStream.bucket(),
inputStream.region());
}
public static MinioFileVO getFile(String clientName, String buketName, String fileName) throws Exception {
GetObjectArgs build = GetObjectArgs.builder().object(fileName).bucket(buketName).build();
return getFile(clientName, build);
}
} }
} }