minio 整合 springboot实现
package com.zhuning.isim.util;
import com.zhuning.isim.entity.Doc;
import com.zhuning.isim.entity.MinIoEntity;
import com.zhuning.isim.excp.AppException;
import com.zhuning.isim.model.DocRDO;
import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import io.minio.errors.MinioException;
import org.springframework.core.env.Environment;
import org.springframework.web.multipart.MultipartFile;
import org.xmlpull.v1.XmlPullParserException;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
/**
* @author : Gyf create at: 2019-09-30 09:34
* @description: minio 相关的共同
*/
public class MinIoUtils {
// 服务器 minio
private static String MINIO_BUCKET = "isim";
private static String MINIO_ADDRESS;
private static String MINIO_ACCESS_KEY;
private static String MINIO_SECRET_KEY;
private static int MINIO_URL_EXPIRE = 60 * 60 * 24 * 7;
static {
Environment env = SpringContextHolder.getBean(Environment.class);
MINIO_BUCKET = env.getProperty("");
MINIO_ADDRESS = env.getProperty("");
MINIO_ACCESS_KEY = env.getProperty("-key");
MINIO_SECRET_KEY = env.getProperty("-key");
MINIO_URL_EXPIRE = Integer.parseInt(Objects.requireNonNull(env.getProperty(""))) * 60 * 60 * 24;
}
/**
* 单例模式-内部类实现链接minio 服务器
*/
private static class MinioClientHolder {
private static MinioClient minioClient;
static {
try {
minioClient = new MinioClient(MINIO_ADDRESS, MINIO_ACCESS_KEY, MINIO_SECRET_KEY);
} catch (InvalidEndpointException | InvalidPortException e) {
e.printStackTrace();
}
}
private static MinioClient linkMinIo() {
return MinioClientHolder.minioClient;
}
}
/**
* @param file 文件
* @param bucketName 上传文件夹
* @return
* @throws Exception
*/
public static MinIoEntity upload(MultipartFile file, String bucketName, String docType) throws Exception {
if (StringUtils.isEmpty(bucketName)) {
bucketName = MINIO_BUCKET;
}
// 连接 minio
MinioClient minioClient = MinioClientHolder.linkMinIo();
// 生成uuid拼接 文件名
String fileName = StringUtils.uuid() + Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
// bucket 是否存在不存在新建
boolean found = minioClient.bucketExists(bucketName);
if (!found) {
minioClient.makeBucket(bucketName);
}
// 上传
minioClient.putObject(bucketName, fileName, file.getInputStream(), file.getSize(), docType);
// 获取一个 下载url(有时间限制 默认7天)
String url = minioClient.presignedGetObject(bucketName, fileName, MINIO_URL_EXPIRE);
return new MinIoEntity(fileName, url);
}
/**
* 文件删除
*/
public static void deleteFile(String bucketName, String fileName) {
// 连接 minio
MinioClient minioClient = MinioClientHolder.linkMinIo();
try {
minioClient.removeObject(bucketName, fileName);
} catch (Exception e) {
throw new AppException("服务器文件删除失败");
}
}
/**
* 文件下载 response 暂无
*/
public static void downloadByResponse(HttpServletResponse response, Doc doc) {
// 连接 minio
MinioClient minioClient = MinioClientHolder.linkMinIo();
String fileName = doc.getDocName();
try {
InputStream stream = minioClient.getObject(doc.getBucketName(), doc.getDocName());
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "utf-8"));
BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
byte[] car = new byte[10240];
int l = 0;
while ((l = stream.read(car)) != -1) {
outputStream.write(car, 0, l);
}
outputStream.flush();
outputStream.close();
stream.close();
} catch (Exception e) {
throw new AppException("下载失败");
}
}
/**
* 文件下载 url
*/
public static DocRDO downloadByUrl(DocRDO doc) {
// 连接 minio
MinioClient minioClient = MinioClientHolder.linkMinIo();
try {
String url = minioClient.presignedGetObject(doc.getBucketName(), doc.getDocName(), 60 * 60 * 24);
doc.setDocUrl(url);
} catch (MinioException | NoSuchAlgorithmException | IOException | InvalidKeyException | XmlPullParserException e) {
throw new AppException("下载失败");
}
return doc;
}
public static Doc downloadByUrl(Doc doc) {
// 连接 minio
MinioClient minioClient = MinioClientHolder.linkMinIo();
try {
String url = minioClient.presignedGetObject(doc.getBucketName(), doc.getDocName(), 60 * 60 * 24);
doc.setDocUrl(url);
} catch (MinioException | NoSuchAlgorithmException | IOException | InvalidKeyException | XmlPullParserException e) {
throw new AppException("下载失败");
}
return doc;
}
}