Java整合minio實現文件預覽上傳和下載


minio 在windows系統安裝和使用

最近在使用minio做圖片存儲,在使用過程中遇到一些問題,總結記錄下來。這里不對minio做過多介紹,具體資料自行查找.

1、官網地址 https://min.io/

2、github地址 https://github.com/minio/minio

3、windows 服務端下載地址 https://dl.minio.io/server/minio/release/windows-amd64/minio.exe

4、安裝啟動

啟動一個cmd窗口,進入minio.exe所在文件夾,輸入如下命令    注:miniodata是需自己創建圖片上傳之后的存儲目錄

.\minio.exe server H:\DevelopTools\miniodata

運行成功之后,會看到下面的界面

 使用命令行界面給出的地址都可以登錄,賬號密碼都在地址下面。登錄后如下圖所示。

在后台管理界面上你可以創建你的Bucket(桶),可以理解為一個文件夾用來存放圖片。桶創建成功之后就可以上傳圖片了

springboot整合minio實現文件預覽上傳和下載

 第一步:引入依賴

 <!--存儲文件依賴-->
 <dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.1.0</version>
</dependency>

第二步:配置參數類

/**
 * minio相關配置 也可以配置在yml文件
 */
@Component
public class ParamConfig {

    public static String endpoint = "http://127.0.0.1:9000";
    public static String accessKey = "minioadmin";
    public static String secretKey = "minioadmin";
    public static String bucketName = "uavtest";

}

第三步:添加MinIoUtil

import cn.hutool.core.date.DateUtil;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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

    public static MinioClient minioClient;

    public static ParamConfig paramConfig;

    /**
     * 初始化minio配置
     */
    @PostConstruct
    public void init() {
        try {
            log.info("Minio Initialize........................");
            minioClient = MinioClient.builder().endpoint(paramConfig.endpoint).credentials(paramConfig.accessKey, paramConfig.secretKey).build();
            createBucket(paramConfig.bucketName);
            log.info("Minio Initialize........................successful");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("初始化minio配置異常: 【{}】", e.fillInStackTrace());
        }
    }

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

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

    /**
     * 獲取全部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
     */
    public static String uploadFile(MultipartFile file) {
        try {
            //如果存儲桶不存在則創建
            if (!bucketExists(ParamConfig.bucketName)) {
                createBucket(ParamConfig.bucketName);
            }
            PutObjectOptions putObjectOptions = new PutObjectOptions(file.getInputStream().available(), -1);
            putObjectOptions.setContentType(file.getContentType());
            String originalFilename = file.getOriginalFilename();
            //得到文件流
            InputStream inputStream = file.getInputStream();
            //保證文件不重名(並且沒有特殊字符)
            String fileName = ParamConfig.bucketName + DateUtil.format(new Date(), "_yyyyMMddHHmmss") + originalFilename;
            minioClient.putObject(ParamConfig.bucketName, fileName, inputStream, putObjectOptions);
            return getPreviewFileUrl(ParamConfig.bucketName, fileName);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 文件上傳
     * 返回下載文件url地址 和下面upload方法僅傳參不同
     * bucketName 也可以直接從ParamConfig對象中獲取
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, String fileName, InputStream stream) {
        minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
        return getPreviewFileUrl(bucketName, fileName);
    }

    /**
     * 文件上傳
     * 返回下載文件url地址  和上面upload方法僅傳參不同
     */
    @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 getPreviewFileUrl(bucketName, fileName);
    }

    /**
     * 刪除文件
     *
     * @param bucketName: 桶名
     * @param fileName:   文件名
     */
    @SneakyThrows(Exception.class)
    public static void deleteFile(String bucketName, String fileName) {
        minioClient.removeObject(bucketName, 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文件的下載或者預覽地址
     * 取決於調用本方法的方法中的PutObjectOptions對象有沒有設置contentType
     *
     * @param bucketName: 桶名
     * @param fileName:   文件名
     */
    @SneakyThrows(Exception.class)
    public static String getPreviewFileUrl(String bucketName, String fileName) {
        return minioClient.presignedGetObject(bucketName, fileName);
    }

}

第四步:接口中引用

 @ResponseBody
    @PostMapping("/tFlightFileUpload")
    @ApiOperation(value = "文件上傳管理-添加minio")
    public Response add(@RequestParam("file") MultipartFile file) throws IOException {
        String url = MinIoUtil.uploadFile(file);
        return Response.success(url);
    }

注:仔細看工具類中的方法上的注釋 可以返回預覽文件和下載文件的URL

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM