minio 整合 springboot实现

时间:2025-02-16 12:12:24
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; } }