欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合Minio的過程(支持公有及私有bucket)

 更新時間:2025年03月27日 10:11:18   作者:一恍過去  
Bucket 是存儲Object的邏輯空間,每個Bucket之間的數(shù)據(jù)是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾,這篇文章主要介紹了SpringBoot整合Minio的過程(支持公有及私有bucket),需要的朋友可以參考下

1、Bucket、Object

  • Bucket 是存儲Object的邏輯空間,每個Bucket之間的數(shù)據(jù)是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾;
  • Object 是存儲到MinIO的基本對象,對用戶而言,相當于文件;

2、常用API

  • bucketExists():用于檢查指定的存儲桶是否存在,返回布爾值,表示存儲桶是否存在;
  • makeBucket():用于創(chuàng)建一個新的存儲桶(bucket),需要指定存儲桶的名稱;
  • listBuckets():用于列出用戶有權訪問的所有存儲桶,返回存儲桶的列表;
  • removeBucket():用于刪除一個已存在的存儲桶(bucket),刪除失敗會拋出異常;
  • putObject():用于上傳文件到指定的存儲桶;
  • statObject():用于檢查指定的對象(文件)的狀態(tài),判斷是否存在;
  • getPresignedObjectUrl():用于生成一個對象(文件)的簽名URL,以便可以通過HTTP訪問;
  • getObject():用于從指定的存儲桶中下載文件;
  • listObjects():用于列出指定存儲桶中的所有對象(文件);
  • removeObject():用于刪除指定存儲桶中的對象,需要指定存儲桶名稱和對象鍵;

3、整合SpringBoot

引入POM包:

    <dependencies>
		<!-- minio -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.9</version>
        </dependency>
	</dependencies>

3.1、yaml配置

minio:
  # 連接地址
  endpoint: http://127.0.0.1:9000
  # 用戶名
  accessKey: admin
  # 密碼
  secretKey: 123456789
  # 設置共有桶,具體名稱可以在MinIo后臺設置,可以直接訪問,格式:http://1ip:port/bucketName/fileName
  publicBucket: public-test
  # 設置私有桶,具體名稱可以在MinIo后臺設置,需要通過getPresignedObjectUrl方法獲取簽名鏈接
  privateBucket: private-test

3.2、MinIo配置

MinIOInfoConfig:

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinIOInfoConfig {
    /**
     * 連接地址
     */
    private String endpoint;
    /**
     * 用戶名
     */
    private String accessKey;
    /**
     * 密碼
     */
    private String secretKey;
    /**
     * 私有bucket
     */
    private String privateBucket;
    /**
     * 公共bucket
     */
    private String publicBucket;
}

MinioConfig:

import io.minio.MinioClient;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    @Bean
    public MinioClient minioClient() {
        //鏈式編程,構建MinioClient對象
        return MinioClient.builder()
                .endpoint(minIOInfoConfig.getEndpoint())
                .credentials(minIOInfoConfig.getAccessKey(), minIOInfoConfig.getSecretKey())
                .build();
    }
}

3.3、Bucket 操作

上傳文件前,需要先進行Bucket 的創(chuàng)建操作,可以直接到MinIo后臺進行創(chuàng)建,也可以通過API接口進行創(chuàng)建,代碼示例如下

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    public void bucket() {
        try {
            String bucketName = "test-bucket";
            // 判斷是否存在
            boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            System.out.println("bucketExists1 = " + bucketExists);
            // 創(chuàng)建
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            // 再次判斷
            bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            System.out.println("bucketExists2 = " + bucketExists);
            // 查詢列表
            List<Bucket> bucketList = minioClient.listBuckets();
            List<String> list = bucketList.stream().map(Bucket::name).toList();
            System.out.println("bucketList = " + list);
            // 刪除
            minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
            // 再次判斷
            bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            System.out.println("bucketExists3 = " + bucketExists);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3.4、Object操作

1. 上傳文件

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
        public void upload(MultipartFile file) {
        try {
            String originalFilename = file.getOriginalFilename();
            // 上傳文件
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(originalFilename)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .build()
            );
            // 判斷文件是否存在
            // 獲取訪問地址
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2、獲取文件狀態(tài)(是否存在)

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void fileState(String fileName) {
        try {
            StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    .build());
            System.out.println("response = " + response);
        } catch (Exception e) {
            log.error("文件不存在");
        }
    }
}

3、生成帶簽名公共訪問連接

1、通過getPresignedObjectUrl方法,生成一個帶到期時間、簽名的URL,這個地址可以提供給沒有登錄的第三方共享訪問或者上傳對象,針對于Bucket為私有的情況。

2、對于共有的的文件,可以通過http://1ip:port/bucketName/fileName格式直接訪問。

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public String getPresignedObjectUrl(String fileName) {
        try {
            String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    // 設置過期時間,3分鐘
                    .expiry(3, TimeUnit.MINUTES)
                    .method(Method.GET)
                    .build());
            System.out.println(presignedObjectUrl);
            return presignedObjectUrl;
        } catch (Exception e) {
            return "獲取鏈接失敗";
        }
    }
}

4、下載文件流

1、通過getObject()方法可以直接獲取文件流,將文件流通過瀏覽器直接下;

2、使用該方式的好處是,在業(yè)務上可以由前端傳入文件Id,服務端通過文件Id查詢到文件名稱再調(diào)用MinIO的API接口獲取文件流,這樣可以實現(xiàn)系統(tǒng)自身對文件的水平權限管理。

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void getObjectByStream(String fileName, HttpServletResponse response) {
        try {
            GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    .build());
            // 轉(zhuǎn)化為流
            getObjectResponse.transferTo(response.getOutputStream());
        } catch (Exception e) {
            log.error("獲取文件失敗");
        }
    }
}

5、獲取文件列表

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void listObjects() {
        try {
            Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    // 以xx開頭的文件名稱
                    // .prefix("/")
                    .build());
            listObjects.forEach(itemResult -> {
                try {
                    Item item = itemResult.get();
                    log.info("文件名稱:" + item.objectName());
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        } catch (Exception e) {
            log.error("獲取文件失敗");
        }
    }
}

6、刪除文件信息

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void removeObject(String fileName) {
        try {
            // 單個刪除
            minioClient.removeObject(RemoveObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    .build());
            // 批量刪除
            List<DeleteObject> list = new ArrayList<>();
            list.add(new DeleteObject(fileName));
            minioClient.removeObjects(RemoveObjectsArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .objects(list)
                    .build());
        } catch (Exception e) {
            log.error("刪除文件失敗");
        }
    }
}

到此這篇關于SpringBoot整合Minio(支持公有及私有bucket)的文章就介紹到這了,更多相關SpringBoot整合Minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼

    Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼

    這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 使用?Spring?Boot?Admin?監(jiān)控應用狀態(tài)的詳細過程

    使用?Spring?Boot?Admin?監(jiān)控應用狀態(tài)的詳細過程

    這篇文章主要介紹了使用?Spring?Boot?Admin?監(jiān)控應用狀態(tài),該模塊采集應用的內(nèi)部信息,并暴露給外部的模塊,支持?HTTP?和?JMX,并可以與一些第三方監(jiān)控系統(tǒng)(如?Prometheus)整合,需要的朋友可以參考下
    2022-09-09
  • java對象數(shù)組實現(xiàn)學生信息管理系統(tǒng)

    java對象數(shù)組實現(xiàn)學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java對象數(shù)組實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • JavaWeb.servlet的基本使用方法詳解

    JavaWeb.servlet的基本使用方法詳解

    Servlet指在服務器端執(zhí)行的一段Java代碼,可以接收用戶的請求和返回給用戶響應結果,下面這篇文章主要給大家介紹了關于JavaWeb.servlet基本使用的相關資料,需要的朋友可以參考下
    2022-04-04
  • Java中實現(xiàn)用戶之間的通訊方式

    Java中實現(xiàn)用戶之間的通訊方式

    在Java中實現(xiàn)用戶間通訊主要有兩種方法:Socket編程和WebSocket,Socket編程允許兩個設備間進行數(shù)據(jù)交換,適用于基本的網(wǎng)絡通訊,本文提供了兩種方法的基本實現(xiàn)代碼和相關配置,幫助開發(fā)者根據(jù)需求選擇合適的通訊方式
    2024-09-09
  • 詳解如何獨立使用ribbon實現(xiàn)業(yè)務客戶端負載均衡

    詳解如何獨立使用ribbon實現(xiàn)業(yè)務客戶端負載均衡

    這篇文章主要為大家介紹了詳解如何獨立使用ribbon實現(xiàn)業(yè)務客戶端負載均衡,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java Clone(類的復制)實例代碼

    Java Clone(類的復制)實例代碼

    Java Clone(類的復制)實例代碼,需要的朋友可以參考一下
    2013-03-03
  • Java搶紅包的紅包生成算法

    Java搶紅包的紅包生成算法

    現(xiàn)在日常生活中搶紅包已經(jīng)成了日常游戲,本篇文章主要介紹了Java搶紅包的紅包生成算法,具有一定的參考價值,有需要的可以了解一下。
    2016-11-11
  • Spring Security實現(xiàn)兩周內(nèi)自動登錄

    Spring Security實現(xiàn)兩周內(nèi)自動登錄"記住我"功能

    登錄過程中經(jīng)常使用的“記住我”功能,也就是我們經(jīng)常會在各種網(wǎng)站登陸時見到的"兩周內(nèi)免登錄",“三天內(nèi)免登錄”的功能。今天小編給大家分享基于Spring Security實現(xiàn)兩周內(nèi)自動登錄"記住我"功能,感興趣的朋友一起看看吧
    2019-11-11
  • 如何運行SpringBoot項目的方法

    如何運行SpringBoot項目的方法

    這篇文章主要介紹了如何運行SpringBoot項目的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論