1. 程式人生 > 其它 >SpringBoot 整合MinIO

SpringBoot 整合MinIO

引入依賴

 <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.1.0</version>
        </dependency>

也用到了這個 如果已經引入就不需要

 <dependency>
            <groupId>org.projectlombok</groupId
> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>

配置檔案yml

minio:
  url: http://192.168.80.134:9000
  access-key: AKIAIOSFODNN7EXAMPLE
  secret-key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  bucket-name: test

MinioProperties.java

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author 
 * @date 2021/06/25
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
    /**
     * minio 服務地址 
http://ip:port */ private String url; /** * 使用者名稱 */ private String accessKey; /** * 密碼 */ private String secretKey; /** * 桶名稱 */ private String bucketName; }

工具類

MinIoUtil.java

import com.example.minio.config.MinioProperties;
import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 *
 * Minio工具類
 */
@Slf4j
@Component
public  class MinIoUtil {

    public static MinioClient minioClient;

    @Autowired
    private MinioProperties minioProperties;

    public static MinIoUtil minIoUtil;

    /**
     * 初始化minio配置
     */
    @PostConstruct
    public  void init() {

        minIoUtil=this;
        minIoUtil.minioProperties=this.minioProperties;
        try {

            minioClient = MinioClient.builder().endpoint(minioProperties.getUrl()).credentials(minioProperties.getAccessKey(),minioProperties.getSecretKey()).build();
            createBucket(minioProperties.getBucketName());
            log.info(">>>>>>>>>>>minio 初始化成功");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("》》》》》》》》》》初始化minio異常: 【{}】", e.fillInStackTrace());
        }


    }

    /**
     * 判斷 bucket是否存在
     *
     * @param bucketName 桶名
     * @return: boolean
     */
    @SneakyThrows(Exception.class)
    public static boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(bucketName);
    }

    /**
     * 建立 bucket
     * @param bucketName 桶名
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static void createBucket(String bucketName) {
        boolean isExist = minioClient.bucketExists(bucketName);
        if (!isExist) {
            minioClient.makeBucket(bucketName);
        }
    }

    /**
     *
     * 獲取全部bucket
     * @return: java.util.List<io.minio.messages.Bucket>
     */
    @SneakyThrows(Exception.class)
    public static List<Bucket> getAllBuckets() {
        return minioClient.listBuckets();
    }

    /**
     * 檔案上傳
     * @param bucketName 桶名
     * @param fileName 檔名
     * @param filePath 檔案路徑
     */
    @SneakyThrows(Exception.class)
    public static void upload(String bucketName, String fileName, String filePath) {
        minioClient.putObject(bucketName, fileName, filePath, null);
    }

    /**
     * 檔案上傳(返回URL下載地址)
     * @param bucketName 桶名
     * @param fileName 檔名
     * @param stream 檔案流
     * @return: 檔案url下載地址
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, String fileName, InputStream stream) {
        minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 檔案上傳 (返回URL下載地址)
     * @param bucketName 桶名
     * @param file 檔案
     * @return: 檔案url下載地址
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, MultipartFile file) {
        final InputStream is = file.getInputStream();
        final String fileName = file.getOriginalFilename();
        minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
        is.close();
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 刪除檔案
     * @param bucketName 桶名
     * @param fileName 檔名
     */
    @SneakyThrows(Exception.class)
    public static void deleteFile(String bucketName, String fileName) {
        minioClient.removeObject(bucketName, fileName);
    }

    /**
     * 下載檔案 (流輸出)
     * @param bucketName  桶名
     * @param fileName 檔名
     */
    @SneakyThrows(Exception.class)
    public static void download(String bucketName, String fileName, HttpServletResponse response) {
        // 獲取物件的元資料
        final ObjectStat stat = minioClient.statObject(bucketName, fileName);
        response.setContentType(stat.contentType());
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        InputStream is = minioClient.getObject(bucketName, fileName);
        IOUtils.copy(is, response.getOutputStream());
        is.close();
    }

    /**
     *
     * 獲取minio檔案的下載地址
     * @param bucketName 桶名
     * @param fileName  檔名
     */
    @SneakyThrows(Exception.class)
    public static String getFileUrl(String bucketName, String fileName) {
        return minioClient.presignedGetObject(bucketName, fileName);
    }


}

使用直接呼叫工具類的方法即可 例如

    @PostMapping(value = "/upload")
    public String upload(@RequestParam(value = "file") MultipartFile file){
        String upload = MinIoUtil.upload("test", file);
        return upload;
    }