1. maven依赖:
io.minio
minio
6.0.13
2. yml文件配置:
minio:
minio_url: http://127.0.0.1:9000
minio_name: minioadmin
minio_pass: minioadmin
bucketName: demo
3. 代码示例:
package org.jeecg.common.util;
import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.filter.StrAttackFilter;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
@Slf4j
public class MinioUtil {
//minio的地址
private static String minioUrl;
//minio的登录用户名
private static String minioName;
//minio的登录密码
private static String minioPass;
//minio的桶名称
private static String bucketName;
public static void setMinioUrl(String minioUrl) {
MinioUtil.minioUrl = minioUrl;
}
public static void setMinioname(String minioName) {
MinioUtil.minioname = minioName;
}
public static void setMinioPass(String minioPass) {
MinioUtil.minioPass = minioPass;
}
public static void setBucketName(String bucketName) {
MinioUtil.bucketName = bucketName;
}
public static String getMinioUrl() {
return minioUrl;
}
public static String getBucketName() {
return bucketName;
}
private static MinioClient minioClient = null;
public static String upload(MultipartFile file, String bizPath, String customBucket) {
String file_url = "";
//update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
bizPath=StrAttackFilter.filter(bizPath);
//update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
String newBucket = bucketName;
if(oConvertUtils.isNotEmpty(customBucket)){
newBucket = customBucket;
}
try {
initMinio(minioUrl, minioName,minioPass);
// 检查存储桶是否已经存在
if(minioClient.bucketExists(newBucket)) {
log.info("Bucket already exists.");
} else {
// 创建一个名为ota的存储桶
minioClient.makeBucket(newBucket);
log.info("create a new bucket.");
}
InputStream stream = file.getInputStream();
// 获取文件名
String orgName = file.getOriginalFilename();
if("".equals(orgName)){
orgName=file.getName();
}
orgName = CommonUtils.getFileName(orgName);
String objectName = bizPath+"/"+orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
// 使用putObject上传一个本地文件到存储桶中。
if(objectName.startsWith("/")){
objectName = objectName.substring(1);
}
minioClient.putObject(newBucket,objectName, stream,stream.available(),"application/octet-stream");
stream.close();
file_url = minioUrl+newBucket+"/"+objectName;
}catch (Exception e){
log.error(e.getMessage(), e);
}
return file_url;
}
public static String upload(MultipartFile file, String bizPath) {
return upload(file,bizPath,null);
}
public static InputStream getMinioFile(String bucketName,String objectName){
InputStream inputStream = null;
try {
initMinio(minioUrl, minioName, minioPass);
inputStream = minioClient.getObject(bucketName, objectName);
} catch (Exception e) {
log.info("文件获取失败" + e.getMessage());
}
return inputStream;
}
public static void removeObject(String objectName) {
try {
initMinio(minioUrl, minioName,minioPass);
minioClient.removeObject(bucketName, objectName);
}catch (Exception e){
log.info("文件删除失败" + e.getMessage());
}
}
public static String getObjectURL(String bucketName, String objectName, Integer expires) {
initMinio(minioUrl, minioName,minioPass);
try{
String url = minioClient.presignedGetObject(bucketName, objectName, expires);
return URLDecoder.decode(url,"UTF-8");
}catch (Exception e){
log.info("文件路径获取失败" + e.getMessage());
}
return null;
}
private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {
if (minioClient == null) {
try {
minioClient = new MinioClient(minioUrl, minioName,minioPass);
} catch (InvalidEndpointException e) {
e.printStackTrace();
} catch (InvalidPortException e) {
e.printStackTrace();
}
}
return minioClient;
}
public static String upload(InputStream stream,String relativePath) throws Exception {
initMinio(minioUrl, minioName,minioPass);
if(minioClient.bucketExists(bucketName)) {
log.info("Bucket already exists.");
} else {
// 创建一个名为ota的存储桶
minioClient.makeBucket(bucketName);
log.info("create a new bucket.");
}
minioClient.putObject(bucketName,relativePath, stream, stream.available(),"application/octet-stream");
stream.close();
return minioUrl+bucketName+"/"+relativePath;
}
public static void putObject(String bucketName, String objectName, InputStream stream) throws Exception {
minioClient.putObject(bucketName, objectName, stream, stream.available(), "application/octet-stream");
}
public static void putObject2(String bucketName, String objectName, InputStream stream,Boolean boolen) throws Exception {
initMinio(minioUrl, minioName,minioPass);
minioClient.putObject(bucketName, objectName, stream, stream.available(), "application/octet-stream");
}
public static void downloadFile(String folder,String wordName, HttpServletResponse response) throws IOException {
initMinio(minioUrl, minioName,minioPass);
try {
// 获取文件对象
InputStream object = minioClient.getObject(bucketName, folder+wordName);
byte buf[] = new byte[1024];
int length = 0;
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" + new String(wordName.getBytes("UTF-8"), "ISO8859-1"));
response.setContentType("application/msword");
response.setCharacterEncoding("UTF-8");
OutputStream outputStream = response.getOutputStream();
// 输出文件
while ((length = object.read(buf)) > 0) {
outputStream.write(buf, 0, length);
}
// 关闭输出流
outputStream.close();
} catch (Exception ex) {
response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "文件下载失败";
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes("UTF-8"));
}
}
}