最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MinIO學(xué)習(xí)指南看這一篇就夠了

 更新時(shí)間:2025年02月26日 11:23:54   作者:中北萌新程序員  
本文介紹了對象存儲、服務(wù)器磁盤和分布式文件系統(tǒng)的基本概念和區(qū)別,重點(diǎn)講解了MinIO的安裝、配置和基本操作,以及如何在SpringBoot項(xiàng)目中集成MinIO,感興趣的朋友一起看看吧

一.前言

對象存儲是一種數(shù)據(jù)存儲架構(gòu),設(shè)計(jì)用于管理和處理大量非結(jié)構(gòu)化數(shù)據(jù)。與傳統(tǒng)的文件存儲和塊存儲不同,對象存儲通過將數(shù)據(jù)分解為離散的、獨(dú)立的單元或“對象”來存儲每個(gè)對象包含數(shù)據(jù)本身、相關(guān)的元數(shù)據(jù)和一個(gè)唯一的標(biāo)識符。

官網(wǎng):https://www.minio.org.cn

以下是對象存儲、服務(wù)器磁盤和分布式文件系統(tǒng)的對比表格:

特性對象存儲服務(wù)器磁盤分布式文件系統(tǒng)
存儲方式以對象為基本單位存儲數(shù)據(jù),每個(gè)對象包含數(shù)據(jù)、元數(shù)據(jù)和唯一標(biāo)識符數(shù)據(jù)直接存儲在服務(wù)器的本地磁盤上數(shù)據(jù)分布在多個(gè)服務(wù)器節(jié)點(diǎn)上,通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)訪問
優(yōu)點(diǎn)高可擴(kuò)展性:能夠輕松擴(kuò)展至數(shù)十乃至數(shù)百EB的容量。 高效性:扁平化結(jié)構(gòu),不受復(fù)雜目錄系統(tǒng)對性能的影響。 安全性高:通常憑借HTTP調(diào)用對象存儲本身提供的認(rèn)證密鑰來提供數(shù)據(jù)訪問。 訪問方便:支持HTTP(S)協(xié)議,采用REST的API方式調(diào)用和檢索數(shù)據(jù)。 成本相對低:與塊存儲方式相比,對象存儲是最具成本效益的數(shù)據(jù)存儲類型。開發(fā)便捷:直接使用服務(wù)器磁盤,無需復(fù)雜的配置和開發(fā)工作。 成本低:如果已有服務(wù)器和磁盤,不需要額外支付存儲服務(wù)費(fèi)用。容易實(shí)現(xiàn)擴(kuò)容:可以通過增加更多的服務(wù)器節(jié)點(diǎn)來擴(kuò)展存儲容量,實(shí)現(xiàn)水平擴(kuò)展。
缺點(diǎn)最終一致性:由于不同節(jié)點(diǎn)的位置不同,數(shù)據(jù)同步時(shí)可能會有一定時(shí)間的延遲或者錯(cuò)誤。 不適合頻繁變動的數(shù)據(jù):對象存儲比較適合存儲那些變動不大甚至不變的文件。擴(kuò)展困難:服務(wù)器磁盤的容量有限,當(dāng)存儲空間不足時(shí),擴(kuò)展磁盤容量可能需要更換更大容量的硬盤或者增加額外的磁盤陣列,成本較高且操作復(fù)雜。復(fù)雜度高:分布式文件系統(tǒng)的部署和維護(hù)相對復(fù)雜,需要專業(yè)的運(yùn)維團(tuán)隊(duì)來管理。

分布式文件系統(tǒng)

分布式文件系統(tǒng)(Distributed File System, DFS)是一種文件系統(tǒng),它使文件可以跨越多個(gè)服務(wù)器或存儲設(shè)備存儲和訪問。DFS 通過網(wǎng)絡(luò)將多個(gè)存儲資源組合成一個(gè)統(tǒng)一的文件系統(tǒng),使用戶和應(yīng)用程序可以像訪問本地文件一樣透明地訪問遠(yuǎn)程文件。

分布式文件系統(tǒng)的關(guān)鍵特性:

  • 透明性:用戶和應(yīng)用程序可以像訪問本地文件一樣訪問遠(yuǎn)程文件,感受不到底層的復(fù)雜性。
  • 高可用性:通過復(fù)制和冗余機(jī)制,確保即使某些節(jié)點(diǎn)或硬件發(fā)生故障,數(shù)據(jù)仍然可用。
  • 可擴(kuò)展性:能夠處理隨著數(shù)據(jù)量和用戶數(shù)增加而增長的需求。
  • 容錯(cuò)性:通過數(shù)據(jù)冗余和錯(cuò)誤檢測機(jī)制,保證系統(tǒng)能繼續(xù)運(yùn)行,即使發(fā)生部分硬件或網(wǎng)絡(luò)故障。
  • 性能:通過分布式架構(gòu),能夠有效地處理大量并發(fā)訪問請求。

MINIO

MinIO 是一個(gè)高性能、輕量級對象存儲服務(wù)器,專為大規(guī)模數(shù)據(jù)存儲和分析而設(shè)計(jì)。它兼容 Amazon S3 API,可以無縫替代 Amazon S3 作為存儲后端,并且支持在各種環(huán)境中部署,包括物理服務(wù)器、虛擬機(jī)、容器等。

FastDFS和MINIO的區(qū)別

以下是MinIO和FastDFS的對比表格:

特性MinIOFastDFS
存儲類型對象存儲文件存儲
架構(gòu)單一守護(hù)進(jìn)程,支持分布式Tracker-Storage 分離
協(xié)議支持S3 兼容,支持 HTTP/REST API專有協(xié)議
數(shù)據(jù)冗余糾刪碼,多節(jié)點(diǎn)和磁盤故障容錯(cuò)主從復(fù)制,多副本
性能高性能,適合大文件和海量數(shù)據(jù)存儲適合小文件存儲,上傳/下載性能較高
擴(kuò)展性高度可擴(kuò)展,支持水平擴(kuò)展可擴(kuò)展但管理復(fù)雜
管理工具Web 界面,支持 Prometheus 監(jiān)控命令行工具
生態(tài)系統(tǒng)廣泛,集成度高生態(tài)相對較小,集成度低
安裝部署簡單,開箱即用復(fù)雜,需要專業(yè)知識
社區(qū)與支持活躍,有官方文檔和社區(qū)支持缺乏官方文檔和持續(xù)更新

MinIO和FastDFS各有優(yōu)勢,MinIO在兼容性、擴(kuò)展性、性能和生態(tài)系統(tǒng)方面表現(xiàn)更佳,適合云原生應(yīng)用、大數(shù)據(jù)分析等場景;而FastDFS在處理小文件方面性能出色,適合需要海量小文件存儲的場景。具體選擇可以根據(jù)實(shí)際需求和使用場景來決定。

二.Windows環(huán)境安裝Minio

1、下載服務(wù)端和客戶端安裝包文件

下載地址:MinIO | Code and downloads to create high performance object storage
服務(wù)端文件:minio.exe 用于接收文件信息
客戶端文件:mac.exe 用于上傳文件 ,如果用程序代碼操作文件存儲,只啟動服務(wù)端就ok

2、啟動minio服務(wù)器

特別提示:在windows 安裝軟件我們都習(xí)慣雙擊.exe 文件啟動。minio可不行奧,可不行,可不行。千萬不能去雙擊運(yùn)行,這樣可能會導(dǎo)致最終啟動失??;無論是windows還是linux都建議通過命令啟動的。

以管理員權(quán)限打開cmd窗口,進(jìn)入到minio.exe所在bin目錄

2.2、設(shè)置用戶名

用于登錄minio客戶端

setx MINIO_ROOT_USER name 

設(shè)置登錄密碼

 setx MINIO_ROOT_PASSWORD password

2.3、啟動Minio服務(wù)

.\minio.exe server D:\develpo\minio\data --console-address "127.0.0.1:9000" --address "127.0.0.1:9005"

D:\develpo\minio\data 指定數(shù)據(jù)存放路徑

9005是控制臺端口,9000是服務(wù)的端口。

4.5、訪問minio服務(wù)器

訪問客戶端地址 http://127.0.0.1:9000/ 輸入用戶密碼

使用 Docker 安裝

docker run -p 9000:9000 minio/minio server /data

三. 基本概念

基本概念

概念定義特點(diǎn)
Object存儲到MinIO的基本對象,如文件、字節(jié)流等具有唯一標(biāo)識,可設(shè)置元數(shù)據(jù)
Bucket用來存儲Object的邏輯空間,相當(dāng)于頂層文件夾數(shù)據(jù)隔離,命名唯一,可設(shè)置權(quán)限
Drive存儲數(shù)據(jù)的磁盤,啟動時(shí)以參數(shù)傳入是數(shù)據(jù)存儲載體,容量有限
Set一組Drive的集合分布式部署自動劃分,對象存儲于其上,Drive數(shù)量固定,盡可能分布在不同節(jié)點(diǎn)

MinIO 糾刪碼 EC (Erasure Code)

糾刪碼(Erasure Code, EC) 是一種數(shù)據(jù)保護(hù)方法,它將數(shù)據(jù)分割成片段,生成冗余數(shù)據(jù)塊,并將這些數(shù)據(jù)塊存儲在不同的位置,如磁盤、存儲節(jié)點(diǎn)或其他地理位置。MinIO 采用 Reed-Solomon 糾刪碼實(shí)現(xiàn),將對象拆分成數(shù)據(jù)塊和奇偶校驗(yàn)塊,以提高數(shù)據(jù)的冗余性和可用性。

簡單來說就是可以通過數(shù)學(xué)計(jì)算,把丟失的數(shù)據(jù)進(jìn)行還原,它可以將n份原始數(shù)據(jù),增加m份數(shù)據(jù),并能通過n+m份中的任意n份數(shù)據(jù),還原為原始數(shù)據(jù)。
即如果有任意小于等于m份的數(shù)據(jù)失效,仍然能通過剩下的數(shù)據(jù)還原出來。

舉個(gè)最簡單例子就是有兩個(gè)數(shù)據(jù)(d1, d2),用一個(gè)校驗(yàn)和y(d1 + d2 = y)即可保證即使丟失其中一個(gè),依然可以還原數(shù)據(jù)。如丟失 d1 ,則使用 y - d2 = d1 還原,同理,d2 丟失或者y丟失,均可通過計(jì)算得出。

存儲形式

當(dāng)文件對象上傳到MinIO時(shí),數(shù)據(jù)會以特定的形式存儲在對應(yīng)的數(shù)據(jù)存儲磁盤中。具體存儲形式如下:

目錄結(jié)構(gòu)

  • 以Bucket名稱為目錄。
  • 文件名稱為下一級目錄。
  • 文件名下包含編碼數(shù)據(jù)塊及檢驗(yàn)塊(EC碼)和元數(shù)據(jù)文件(xl.meta)。

數(shù)據(jù)塊和元數(shù)據(jù)文件

  • 編碼數(shù)據(jù)塊及檢驗(yàn)塊(EC碼):這些塊存儲在奇數(shù)編號的磁盤上,例如data01和data03。
  • 元數(shù)據(jù)文件(xl.meta):這些文件存儲在偶數(shù)編號的磁盤上,例如data02和data04。

例如,假設(shè)我們有四塊磁盤:data01、data02、data03、data04。存儲形式如下:

data01

    • /bucket_name/file_name/part.1(編碼數(shù)據(jù)塊)
    • /bucket_name/file_name/part.2(編碼數(shù)據(jù)塊)

data02

  • /bucket_name/file_name/xl.meta(元數(shù)據(jù)文件)

data03

  • /bucket_name/file_name/part.3(編碼數(shù)據(jù)塊)
  • /bucket_name/file_name/part.4(編碼數(shù)據(jù)塊)…

data04

  • /bucket_name/file_name/xl.meta(元數(shù)據(jù)文件)

這種存儲形式確保了數(shù)據(jù)的冗余和高可用性,通過糾刪碼技術(shù),即使部分磁盤損壞,數(shù)據(jù)仍然可以被恢復(fù)。

Minio中的存儲級別

Minio當(dāng)前支持兩種存儲級別:Reduced RedundancyStandard,通過對兩種級別的設(shè)置來修改對象的Parity Drives ( P)(奇偶校驗(yàn)塊)和Data Drives (D)(數(shù)據(jù)塊)的比例,讓用戶能夠更好的控制磁盤使用率和容錯(cuò)性。

STANDARD

STANDARD存儲級別包含比REDUCED_REDUNDANCY存儲級別更多的奇偶校驗(yàn)塊,因此STANDARD存儲級別的奇偶校驗(yàn)塊需要滿足如下條件:

  • 在未設(shè)置REDUCED_REDUNDANCY存儲級別的情況下,STANDARD存儲級別的奇偶校驗(yàn)塊需要大于等于2;
  • 在設(shè)置了REDUCED_REDUNDANCY存儲級別的情況下,STANDARD存儲級別的奇偶校驗(yàn)塊需要大于REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊數(shù)量
  • 奇偶校驗(yàn)塊的數(shù)量必須小于數(shù)據(jù)塊,所以STANDARD存儲級別的奇偶校驗(yàn)塊不能大于N/2(N為Erasure Set中的磁盤數(shù)量)

STANDARD存儲級別的奇偶校驗(yàn)塊的默認(rèn)值取決于Erasure Set中的磁盤數(shù)量:

Erasure Set SizeDefault Parity (EC:N)
5 or fewerEC:2
6-7EC:3
8 or moreEC:4

REDUCED_REDUNDANCY存儲級別包含比STANDARD存儲級別更少的奇偶校驗(yàn)塊,因此REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊需要滿足如下條件:

  • 在未設(shè)置STANDARD存儲級別的情況下,REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊需要小于N/2
  • 在設(shè)置了STANDARD存儲級別的情況下,REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊需要小于STANDARD存儲級別的奇偶校驗(yàn)塊數(shù)量
  • 奇偶校驗(yàn)塊的數(shù)量必須小于數(shù)據(jù)塊,且REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊需要小于STANDARD存儲級別的奇偶校驗(yàn)塊數(shù)量,那么REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊需要大于等于2,所以Erasure Set中的磁盤數(shù)量大于4的時(shí)候才支持REDUCED_REDUNDANCY存儲級別。

REDUCED_REDUNDANCY存儲級別的奇偶校驗(yàn)塊默認(rèn)值為:EC:2

使用

配置存儲級別
有以下兩種配置方式:

環(huán)境變量

export MINIO_STORAGE_CLASS_STANDARD=EC:4
export MINIO_STORAGE_CLASS_RRS=EC:2

設(shè)置以上環(huán)境變量并重啟服務(wù)

mc admin

mc admin config set myminio/ storage_class standard="EC:4"
mc admin config set myminio/ storage_class rrs="EC:2"
# 重啟minio服務(wù)
mc admin service restart myminio/

存儲方案

四. 命令操作

列出存儲桶

mc ls <alias>

這會列出指定 MinIO 服務(wù)器上的所有存儲桶。

創(chuàng)建存儲桶

mc mb <alias>/<bucket_name>

這會在指定 MinIO 服務(wù)器上創(chuàng)建一個(gè)新的存儲桶。

上傳文件

mc cp <file_path> <alias>/<bucket_name>

這會將本地文件上傳到指定的 MinIO 存儲桶中。

下載文件

mc cp <alias>/<bucket_name>/<file_name> <local_file_path>

這會將 MinIO 存儲桶中的文件下載到本地。

復(fù)制對象

mc cp <source> <target>

這會復(fù)制對象從一個(gè)位置到另一個(gè)位置,可以是存儲桶內(nèi)的對象或不同存儲桶間的對象。

移動對象

mc mv <source> <target>

這會移動對象從一個(gè)位置到另一個(gè)位置,與復(fù)制不同的是,移動后源位置的對象將被刪除。

刪除對象

mc rm <alias>/<bucket_name>/<object_name>

這會刪除指定的對象。

刪除存儲桶

mc rb <alias>/<bucket_name>

這會刪除指定的存儲桶及其中的所有對象。

五 . MinIO 整合 SpringBoot

1、導(dǎo)入依賴:

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

2、在SpringBoot的配置文件中編寫 MinIO 的配置:

minio:
  config:
    url: http://127.0.0.1:9005 #ip地址
    accessKey: admin #  賬號
    secretKey: admin962464 #  密碼
    secure: false #如果是true,則用的是https而不是http,默認(rèn)值是true
    bucketName: "test"  # 桶的名字 相當(dāng)于文件夾

3、編寫 MinIO 配置類:

import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "minio.config")
public class MinioConfig {
    /**
     * 服務(wù)地址
     */
    private String url;
    /**
     * 用戶名
     */
    private String accessKey;
    /**
     * 密碼
     */
    private String secretKey;
    /**
     * 存儲桶名稱
     */
    private String bucketName;
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}

4、編寫 MinIO 的工具類:

import com.jjy.shopping_file_service.config.MinioConfig;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Slf4j
@Component
public class MinIOUtil {
    @Resource
    private MinioConfig minioConfig;
    @Resource
    private MinioClient minioClient;
    /**
     * 查看存儲bucket是否存在
     *
     * @param bucketName 存儲桶名稱
     * @return boolean
     */
    public Boolean bucketExists(String bucketName) {
        Boolean found;
        try {
            found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return found;
    }
    /**
     * 創(chuàng)建存儲bucket
     *
     * @param bucketName 存儲桶名稱
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 刪除存儲bucket
     *
     * @param bucketName 存儲桶名稱
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 獲取全部bucket
     *
     * @return 存儲桶列表
     */
    public List<Bucket> getAllBuckets() {
        try {
            return minioClient.listBuckets();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 文件上傳
     *
     * @param file 文件
     * @return 文件對象名稱
     */
    public String upload(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        System.out.println(originalFilename);
        if (!StringUtils.hasText(originalFilename)) {
            throw new RuntimeException();
        }
        String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
        String prefix = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
        String objectName = prefix + "/" + fileName;
        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(objectName)
                    .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
            // 文件名稱相同會覆蓋
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return objectName;
    }
    /**
     * 預(yù)覽圖片
     *
     * @param fileName 文件名稱
     * @return 文件預(yù)覽鏈接
     */
    public String preview(String fileName) {
        // 查看文件地址
        GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
                .builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName).method(Method.GET).build();
        try {
            String url = minioClient.getPresignedObjectUrl(build);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 文件下載
     *
     * @param fileName 文件名稱
     * @param res      response
     */
    public void download(String fileName, HttpServletResponse res) {
        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioConfig.getBucketName())
                .object(fileName).build();
        try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
            byte[] buf = new byte[1024];
            int len;
            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
                while ((len = response.read(buf)) != -1) {
                    os.write(buf, 0, len);
                }
                os.flush();
                byte[] bytes = os.toByteArray();
                res.setCharacterEncoding("utf-8");
                res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
                try (ServletOutputStream stream = res.getOutputStream()) {
                    stream.write(bytes);
                    stream.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 查看文件對象
     *
     * @return 存儲bucket內(nèi)文件對象信息
     */
    public List<Item> listObjects() {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(minioConfig.getBucketName()).build());
        List<Item> items = new ArrayList<>();
        try {
            for (Result<Item> result : results) {
                items.add(result.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return items;
    }
    /**
     * 刪除
     *
     * @param fileName 文件名稱
     * @return 是否刪除成功
     */
    public boolean remove(String fileName) {
        try {
            minioClient.removeObject(RemoveObjectArgs.builder()
                    .bucket(minioConfig.getBucketName())
                    .object(fileName)
                    .build());
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}

5、Controller:

import com.cyw.miniodemo.config.MinioConfig;
import com.cyw.miniodemo.pojo.Rst;
import com.cyw.miniodemo.service.FileUploadService;
import com.cyw.miniodemo.utils.MinIOUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/api/file")
@AllArgsConstructor
public class FileUploadController {
    private MinioConfig minioConfig;
    private MinIOUtil minIOUtil;
    private FileUploadService fileUploadService;
    @GetMapping("/bucketExists")
    public Rst bucketExists(@RequestParam("bucketName") String bucketName) {
        Map<String, Object> map = new HashMap<>();
        map.put("bucketExists", minIOUtil.bucketExists(bucketName));
        return Rst.ok("查詢成功", map);
    }
    @GetMapping("/makeBucket")
    public Rst makeBucket(@RequestParam("bucketName") String bucketName) {
        Map<String, Object> map = new HashMap<>();
        map.put("makeBucketSuccess", minIOUtil.makeBucket(bucketName));
        return Rst.ok("創(chuàng)建成功", map);
    }
    @GetMapping("/removeBucket")
    public Rst removeBucket(@RequestParam("bucketName") String bucketName) {
        Map<String, Object> map = new HashMap<>();
        map.put("deleteBucketSuccess", minIOUtil.removeBucket(bucketName));
        return Rst.ok("刪除成功", map);
    }
    @GetMapping("/getAllBuckets")
    public Rst getAllBuckets() {
        Map<String, Object> map = new HashMap<>();
        map.put("buckets", minIOUtil.getAllBuckets());
        return Rst.ok("查詢成功", map);
    }
    @PostMapping("/upload")
    public Rst upload(@RequestParam("file") MultipartFile file) {
        String objectName = minIOUtil.upload(file);
        if (objectName != null) {
            Map<String, Object> map = new HashMap<>();
            map.put("url", (minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + objectName));
            return Rst.ok("上傳成功", map);
        }
        return Rst.fail("上傳失敗");
    }
    @GetMapping("/preview")
    public Rst preview(@RequestParam("fileName") String fileName) {
        Map<String, Object> map = new HashMap<>();
        map.put("url", minIOUtil.preview(fileName));
        return Rst.ok("預(yù)覽成功", map);
    }
    @GetMapping("/download")
    public Rst download(@RequestParam("fileName") String fileName, HttpServletResponse resp) {
        minIOUtil.download(fileName, resp);
        return Rst.ok();
    }
    @PostMapping("/delete")
    public Rst remove(@RequestBody Map<String, String> params) {
        String url = params.get("url");
        String objName = url.substring(url.lastIndexOf(minioConfig.getBucketName() + "/") + minioConfig.getBucketName().length() + 1);
        log.info("刪除對象: {}", objName);
        minIOUtil.remove(objName);
        return Rst.ok("刪除成功");
    }
}

到此這篇關(guān)于MinIO學(xué)習(xí)指南看這一篇就夠了的文章就介紹到這了,更多相關(guān)MinIO命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?List<JSONObject>中的數(shù)據(jù)如何轉(zhuǎn)換為List<T>

    Java?List<JSONObject>中的數(shù)據(jù)如何轉(zhuǎn)換為List<T>

    這篇文章主要介紹了Java?List<JSONObject>中的數(shù)據(jù)如何轉(zhuǎn)換為List<T>問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java代碼是如何被CPU狂飆起來的

    Java代碼是如何被CPU狂飆起來的

    無論是剛剛?cè)腴TJava的新手還是已經(jīng)工作了的老司機(jī),恐怕都不容易把Java代碼如何一步步被CPU執(zhí)行起來這個(gè)問題完全講清楚。本文就帶你詳細(xì)了解Java代碼到底是怎么運(yùn)行起來的。感興趣的同學(xué)可以參考閱讀
    2023-03-03
  • java并發(fā)請求下數(shù)據(jù)插入重復(fù)問題的解決方法

    java并發(fā)請求下數(shù)據(jù)插入重復(fù)問題的解決方法

    現(xiàn)在遇到一個(gè)項(xiàng)目,移動設(shè)備存儲數(shù)據(jù),然后一起上傳,那就出現(xiàn)了許多重復(fù)數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java并發(fā)請求下數(shù)據(jù)插入重復(fù)問題的解決方法,需要的朋友可以參考下
    2021-11-11
  • IDEA 2020 2全家桶安裝激活超詳細(xì)圖文教程

    IDEA 2020 2全家桶安裝激活超詳細(xì)圖文教程

    這篇文章主要介紹了IDEA-2020-2 全家桶安裝激活超詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java基于RMI遠(yuǎn)程過程調(diào)用詳解

    java基于RMI遠(yuǎn)程過程調(diào)用詳解

    這篇文章主要為大家詳細(xì)介紹了java基于RMI遠(yuǎn)程過程調(diào)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • java RMI詳細(xì)介紹及實(shí)例講解

    java RMI詳細(xì)介紹及實(shí)例講解

    這篇文章主要介紹了java RMI詳細(xì)介紹及實(shí)例講解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于線程池你不得不知道的一些設(shè)置

    關(guān)于線程池你不得不知道的一些設(shè)置

    這篇文章主要介紹了關(guān)于線程池你不得不知道的一些設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2019-04-04
  • java Socket實(shí)現(xiàn)多人群聊與私聊功能

    java Socket實(shí)現(xiàn)多人群聊與私聊功能

    這篇文章主要為大家詳細(xì)介紹了java Socket實(shí)現(xiàn)多人群聊與私聊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringCloud通用請求字段攔截處理方法

    SpringCloud通用請求字段攔截處理方法

    這篇文章主要介紹了SpringCloud通用請求字段攔截處理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java連接FTP服務(wù)器圖文教程

    java連接FTP服務(wù)器圖文教程

    這篇文章主要給大家介紹了關(guān)于java連接FTP服務(wù)器的相關(guān)資料,Ftp是一種常見的文件存儲服務(wù)器,在很多的項(xiàng)目中都有使用,方便存儲各種格式的文件,使用java連接ftp文件服務(wù)器也是常用的工具類,需要的朋友可以參考下
    2023-08-08

最新評論

四川省| 蒲城县| 垫江县| 酒泉市| 顺昌县| 中宁县| 保德县| 景东| 铜陵市| 扶沟县| 甘南县| 陵水| 玉门市| 太仆寺旗| 阳曲县| 红桥区| 仙桃市| 如东县| 鄯善县| 岳普湖县| 汝城县| 库尔勒市| 新蔡县| 施秉县| 阳泉市| 奉贤区| 大兴区| 康平县| 宣城市| 乐陵市| 惠来县| 子长县| 遵化市| 印江| 辽宁省| 静安区| 平武县| 洪湖市| 邵东县| 永新县| 卓尼县|