亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MinIO使用基礎(chǔ)教程(最新整理)

 更新時(shí)間:2025年03月07日 12:14:39   作者:容若只如初見(jiàn)  
文章介紹了MinIO云存儲(chǔ)服務(wù)的快速安裝和使用,并通過(guò)SpringBoot實(shí)現(xiàn)文件上傳和查詢的功能,感興趣的朋友跟隨小編一起看看吧

一、背景

對(duì)于網(wǎng)站系統(tǒng),若為降低成本投入,將文件存儲(chǔ)服務(wù)和網(wǎng)站系統(tǒng)部署在同一臺(tái)服務(wù)器中,訪問(wèn)量不大,基本不會(huì)有問(wèn)題,但訪問(wèn)量逐漸升高,網(wǎng)站文件資源讀取逐漸頻繁,單機(jī)服務(wù)器可能難以承載較大的請(qǐng)求量,可能會(huì)出現(xiàn)網(wǎng)站打不開(kāi),甚至系統(tǒng)異常等問(wèn)題。

解決方案:采用云存儲(chǔ)服務(wù),將訪問(wèn)很頻繁的文件資源服務(wù),由本地改成云廠商提供的文件存儲(chǔ)服務(wù),比如阿里云 OSS、七牛云、騰訊云、百度云等等,遷移之后,網(wǎng)站的訪問(wèn)壓力會(huì)得到極大的釋放,服務(wù)也會(huì)變得更加穩(wěn)定。

但是,這些云存儲(chǔ)服務(wù)大部分都是收費(fèi)的,以阿里云為例,數(shù)據(jù)存儲(chǔ)通常按照 0.12 元/GB/月的標(biāo)準(zhǔn)來(lái)收費(fèi),日積月累也是一筆巨款。

采用免費(fèi)開(kāi)源的 fastDFS 工具來(lái)作為文件存儲(chǔ)服務(wù)器,雖然性能不錯(cuò),但軟件安裝環(huán)境非常復(fù)雜,且沒(méi)有完整的技術(shù)文檔,大部分都是公司或者網(wǎng)友自己總結(jié)的文檔,維護(hù)起來(lái)非常困難。

直到 MinIO應(yīng)運(yùn)而生,云存儲(chǔ)服務(wù)工具便多一個(gè)新的可選項(xiàng)。

MinIO 是一款號(hào)稱世界上速度最快的對(duì)象存儲(chǔ)服務(wù),專為大規(guī)模數(shù)據(jù)存儲(chǔ)和分析而設(shè)計(jì)。支持在各種環(huán)境中部署,包括物理服務(wù)器、虛擬機(jī)、容器等,最關(guān)鍵的是它的技術(shù)文檔非常完善,非常容易上手;同時(shí),對(duì)個(gè)人用戶是完全開(kāi)源免費(fèi)的。

二、快速安裝

2.1 虛擬機(jī)安裝

Centos7安裝Minio筆記

docker啟動(dòng)minio命令:

docker run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name minio1 \
   -v D:\minio\data:/data \
   -e "MINIO_ROOT_USER=ROOTUSER" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   quay.io/minio/minio server /data --console-address ":9001"

相關(guān)參數(shù)解讀:

docker run:表示啟動(dòng)運(yùn)行容器
-p:表示為容器綁定一個(gè)本地的端口
-name:表示為容器創(chuàng)建一個(gè)本地的名字
-v:表示將文件路徑設(shè)置為容器使用的持久卷位置。當(dāng) MinIO 將數(shù)據(jù)寫入 /data時(shí),該數(shù)據(jù)會(huì)鏡像到本地路徑~/minio/data, 使其能夠在容器重新啟動(dòng)時(shí)保持持久化。您可以設(shè)置任何具有讀取、寫入和刪除權(quán)限的文件路徑來(lái)使用。
-e:表示設(shè)置登陸控制臺(tái)的用戶名和密碼。其中控制臺(tái)的訪問(wèn)地址為http://本機(jī)ip:9001,api 的訪問(wèn)地址為http://本機(jī)ip:9000。

2.2 Windows安裝

2.2.1 下載MinIO服務(wù)器

下載地址:

https://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe

ps:不能雙擊文件來(lái)運(yùn)行,下一步包括運(yùn)行可執(zhí)行文件的指令。

2.2.2 啟動(dòng) MinIO Server

在PowerShell或命令提示符中,cd命令進(jìn)到可執(zhí)行文件的位置,或添加minio.exe文件所在路徑 至windows系統(tǒng)環(huán)境變量 $PATH 中。

假設(shè)存放路徑為:D:\tool\minio\minio.exe,就需要:cd D:\tool\minio,
然后執(zhí)行命令:

.\minio.exe server D:\tool\minio --console-address :9090

控制臺(tái)窗口會(huì)輸出打印內(nèi)容:

API: http://192.0.2.10:9000  http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin

Console: http://192.0.2.10:9090 http://127.0.0.1:9090
RootUser: minioadmin
RootPass: minioadmin

Command-line: https://minio.org.cn/docs/minio/linux/reference/minio-mc.html
   $ mc alias set myminio http://192.0.2.10:9000 minioadmin minioadmin

Documentation: https://minio.org.cn/docs/minio/linux/index.html

WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables.

該服務(wù)與當(dāng)前PowerShell 或命令提示符窗口相綁定。 關(guān)閉窗口將停止服務(wù)器并結(jié)束該服務(wù)。

2.2.3 通過(guò)瀏覽器訪問(wèn)MinIO服務(wù)控制臺(tái)

訪問(wèn) MinIO控制臺(tái):

http://127.0.0.1:9090

MinIO使用監(jiān)聽(tīng)的端口為 9000 端口,這個(gè)端口使用API與MinIO服務(wù)器進(jìn)行通信和進(jìn)行SDK調(diào)用,通過(guò)瀏覽器訪問(wèn) 9000 端口會(huì)自動(dòng)跳轉(zhuǎn)至MinIO控制臺(tái)。

登錄MinIO 控制臺(tái)可以使用默認(rèn)的 Root用戶名/密碼 登錄: minioadmin / minioadmin 。
就可以顯示相關(guān)控制臺(tái)的詳細(xì)信息。

三、使用介紹

在對(duì)象存儲(chǔ)服務(wù)里面,所有的文件都是以桶的形式來(lái)組織的。簡(jiǎn)單說(shuō),可以將桶看作是目錄,這個(gè)目錄下有很多的文件或者文件夾,這和其它云存儲(chǔ)服務(wù)基本一致。

3.1 創(chuàng)建存儲(chǔ)桶

所有的文件必須要存儲(chǔ)到桶中,因此需要先創(chuàng)建存儲(chǔ)桶。

若要修改存儲(chǔ)桶信息,點(diǎn)擊左側(cè)的Buckets菜單,即可展示存儲(chǔ)桶配置信息。

3.2 上傳和下載文件

點(diǎn)擊Object Browser菜單,可看到剛剛創(chuàng)建的存儲(chǔ)桶public-bucket,點(diǎn)擊進(jìn)入,上傳想要存儲(chǔ)的文件。

若想下載文件或者預(yù)覽文件,點(diǎn)擊文件,右側(cè)會(huì)彈出相關(guān)的操作按鈕,點(diǎn)擊相應(yīng)的操作按鈕即可。

3.3 設(shè)置文件公開(kāi)訪問(wèn)

默認(rèn)創(chuàng)建的存儲(chǔ)桶,均為私有桶,無(wú)法被公開(kāi)訪問(wèn)。

以 api 方式直接訪問(wèn),會(huì)提示無(wú)權(quán)限:

127.0.0.1:9000/public-bucket/sso流程圖.png

通常而言,要將數(shù)據(jù)寫入操作進(jìn)行控制;而讀操作,很多不涉及安全問(wèn)題,希望能被互聯(lián)網(wǎng)公開(kāi)訪問(wèn),以便加快文件的訪問(wèn)速度。

可以在存儲(chǔ)桶里面配置,將數(shù)據(jù)讀取權(quán)限設(shè)置為公開(kāi)訪問(wèn):

再次訪問(wèn):

此時(shí)文件可以公開(kāi)訪問(wèn)。

四、實(shí)戰(zhàn)SpringBoot + Minio實(shí)現(xiàn)文件上傳和查詢

引入依賴:

<!-- 操作minio的java客戶端-->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.2</version>
</dependency>
<!-- 操作minio的java客戶端-->
 <dependency>
    <groupId>io.minio</groupId>
     <artifactId>minio</artifactId>
     <version>8.2.1</version>
</dependency>
<!--        jwt鑒權(quán)相應(yīng)依賴-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
</dependency>

獲取API訪問(wèn)憑證:

編寫配置文件:

server:
    port: 8080
spring:
    servlet:
        multipart:
            max-file-size: 10MB
            max-request-size: 10MB
    #minio配置
    minio:
        access-key: dAMaxkWaXUD1CV1JHbqw
        secret-key: AXt3SD0JFkDENFbMeJKOOQb5wj8KvabZWu33Rs84
        url: http://192.168.18.14:9090  #訪問(wèn)地址
        bucket-name: public-bucket

創(chuàng)建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 = "spring.minio")
public class MinioConfig {
    private String accessKey;
    private String secretKey;
    private String url;
    private String bucketName;
    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(url)
                .credentials(accessKey,secretKey)
                .build();
    }
}

創(chuàng)建Minio的工具類:

import com.xiaohui.config.MinioConfig;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import lombok.SneakyThrows;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
 * @Description Minio工具類
 */
@Component
public class MinioUtils {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinioConfig configuration;
    /**
     * @param name 名字
     * @Description description: 判斷bucket是否存在,不存在則創(chuàng)建
     */
    public boolean existBucket(String name) {
        boolean exists;
        try {
            exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
            if (!exists) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
                exists = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            exists = false;
        }
        return exists;
    }
    /**
     * @param bucketName 存儲(chǔ)bucket名稱
     * @Description 創(chuàng)建存儲(chǔ)bucket
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * @param bucketName 存儲(chǔ)bucket名稱
     * @Description 刪除存儲(chǔ)bucket
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * @param fileName 文件名稱
     * @param time     時(shí)間
     * @Description 獲取上傳臨時(shí)簽名
     */
    @SneakyThrows
    public Map getPolicy(String fileName, ZonedDateTime time) {
        PostPolicy postPolicy = new PostPolicy(configuration.getBucketName(), time);
        postPolicy.addEqualsCondition("key", fileName);
        try {
            Map<String, String> map = minioClient.getPresignedPostFormData(postPolicy);
            HashMap<String, String> map1 = new HashMap<>();
            map.forEach((k, v) -> {
                map1.put(k.replaceAll("-", ""), v);
            });
            map1.put("host", configuration.getUrl() + "/" + configuration.getBucketName());
            return map1;
        } catch (ErrorResponseException e) {
            e.printStackTrace();
        } catch (InsufficientDataException e) {
            e.printStackTrace();
        } catch (InternalException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidResponseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (XmlParserException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * @param objectName 對(duì)象名稱
     * @param method     方法
     * @param time       時(shí)間
     * @param timeUnit   時(shí)間單位
     * @Description 獲取上傳文件的url
     */
    public String getPolicyUrl(String objectName, Method method, int time, TimeUnit timeUnit) {
        try {
            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(method)
                    .bucket(configuration.getBucketName())
                    .object(objectName)
                    .expiry(time, timeUnit).build());
        } catch (ErrorResponseException e) {
            e.printStackTrace();
        } catch (InsufficientDataException e) {
            e.printStackTrace();
        } catch (InternalException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidResponseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (XmlParserException e) {
            e.printStackTrace();
        } catch (ServerException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * @param file     文件
     * @param fileName 文件名稱
     * @Description 上傳文件
     */
    public void upload(MultipartFile file, String fileName) {
        // 使用putObject上傳一個(gè)文件到存儲(chǔ)桶中。
        try {
            InputStream inputStream = file.getInputStream();
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(configuration.getBucketName())
                    .object(fileName)
                    .stream(inputStream, file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build());
        } catch (ErrorResponseException e) {
            e.printStackTrace();
        } catch (InsufficientDataException e) {
            e.printStackTrace();
        } catch (InternalException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidResponseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (XmlParserException e) {
            e.printStackTrace();
        }
    }
    /**
     * @param objectName 對(duì)象名稱
     * @param time       時(shí)間
     * @param timeUnit   時(shí)間單位
     * @Description 根據(jù)filename獲取文件訪問(wèn)地址
     */
    public String getUrl(String objectName, int time, TimeUnit timeUnit) {
        String url = null;
        try {
            url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(configuration.getBucketName())
                    .object(objectName)
                    .expiry(time, timeUnit).build());
        } catch (ErrorResponseException e) {
            e.printStackTrace();
        } catch (InsufficientDataException e) {
            e.printStackTrace();
        } catch (InternalException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidResponseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (XmlParserException e) {
            e.printStackTrace();
        } catch (ServerException e) {
            e.printStackTrace();
        }
        return url;
    }
    /**
     * @Description description: 下載文件
     */
    public ResponseEntity<byte[]> download(String fileName) {
        ResponseEntity<byte[]> responseEntity = null;
        InputStream in = null;
        ByteArrayOutputStream out = null;
        try {
            in = minioClient.getObject(GetObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).build());
            out = new ByteArrayOutputStream();
            IOUtils.copy(in, out);
            //封裝返回值
            byte[] bytes = out.toByteArray();
            HttpHeaders headers = new HttpHeaders();
            try {
                headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            headers.setContentLength(bytes.length);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setAccessControlExposeHeaders(Arrays.asList("*"));
            responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return responseEntity;
    }
    /**
     * @param objectFile 對(duì)象文件
     */
    public String getFileUrl(String objectFile) {
        try {
            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(configuration.getBucketName())
                    .object(objectFile)
                    .build()
            );
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

其中包含的常量
http請(qǐng)求狀態(tài):

/**
 * @Description http請(qǐng)求狀態(tài)
 */
public class HttpStatus
{
    /**
     * 操作成功
     */
    public static final int SUCCESS = 200;
    /**
     * 對(duì)象創(chuàng)建成功
     */
    public static final int CREATED = 201;
    /**
     * 請(qǐng)求已經(jīng)被接受
     */
    public static final int ACCEPTED = 202;
    /**
     * 操作已經(jīng)執(zhí)行成功,但是沒(méi)有返回?cái)?shù)據(jù)
     */
    public static final int NO_CONTENT = 204;
    /**
     * 資源已被移除
     */
    public static final int MOVED_PERM = 301;
    /**
     * 重定向
     */
    public static final int SEE_OTHER = 303;
    /**
     * 資源沒(méi)有被修改
     */
    public static final int NOT_MODIFIED = 304;
    /**
     * 參數(shù)列表錯(cuò)誤(缺少,格式不匹配)
     */
    public static final int BAD_REQUEST = 400;
    /**
     * 未授權(quán)
     */
    public static final int UNAUTHORIZED = 401;
    /**
     * 訪問(wèn)受限,授權(quán)過(guò)期
     */
    public static final int FORBIDDEN = 403;
    /**
     * 資源,服務(wù)未找到
     */
    public static final int NOT_FOUND = 404;
    /**
     * 不允許的http方法
     */
    public static final int BAD_METHOD = 405;
    /**
     * 資源沖突,或者資源被鎖
     */
    public static final int CONFLICT = 409;
    /**
     * 不支持的數(shù)據(jù),媒體類型
     */
    public static final int UNSUPPORTED_TYPE = 415;
    /**
     * 系統(tǒng)內(nèi)部錯(cuò)誤
     */
    public static final int ERROR = 500;
    /**
     * 接口未實(shí)現(xiàn)
     */
    public static final int NOT_IMPLEMENTED = 501;
    /**
     * 系統(tǒng)警告消息
     */
    public static final int WARN = 601;
}

通用常量信息:

import io.jsonwebtoken.Claims;
/**
 * @Description 通用常量信息
 */
public class Constants
{
    /**
     * UTF-8 字符集
     */
    public static final String UTF8 = "UTF-8";
    /**
     * GBK 字符集
     */
    public static final String GBK = "GBK";
    /**
     * www主域
     */
    public static final String WWW = "www.";
    /**
     * http請(qǐng)求
     */
    public static final String HTTP = "http://";
    /**
     * https請(qǐng)求
     */
    public static final String HTTPS = "https://";
    /**
     * 通用成功標(biāo)識(shí)
     */
    public static final String SUCCESS = "0";
    /**
     * 通用失敗標(biāo)識(shí)
     */
    public static final String FAIL = "1";
    /**
     * 登錄成功
     */
    public static final String LOGIN_SUCCESS = "Success";
    /**
     * 注銷
     */
    public static final String LOGOUT = "Logout";
    /**
     * 注冊(cè)
     */
    public static final String REGISTER = "Register";
    /**
     * 登錄失敗
     */
    public static final String LOGIN_FAIL = "Error";
    /**
     * 驗(yàn)證碼有效期(分鐘)
     */
    public static final Integer CAPTCHA_EXPIRATION = 2;
    /**
     * 令牌
     */
    public static final String TOKEN = "token";
    /**
     * 令牌前綴
     */
    public static final String TOKEN_PREFIX = "Bearer ";
    /**
     * 令牌前綴
     */
    public static final String LOGIN_USER_KEY = "login_user_key";
    /**
     * 用戶ID
     */
    public static final String JWT_USERID = "userid";
    /**
     * 用戶名稱
     */
    public static final String JWT_USERNAME = Claims.SUBJECT;
    /**
     * 用戶頭像
     */
    public static final String JWT_AVATAR = "avatar";
    /**
     * 創(chuàng)建時(shí)間
     */
    public static final String JWT_CREATED = "created";
    /**
     * 用戶權(quán)限
     */
    public static final String JWT_AUTHORITIES = "authorities";
    /**
     * 資源映射路徑 前綴
     */
    public static final String RESOURCE_PREFIX = "/profile";
    /**
     * RMI 遠(yuǎn)程方法調(diào)用
     */
    public static final String LOOKUP_RMI = "rmi:";
    /**
     * LDAP 遠(yuǎn)程方法調(diào)用
     */
    public static final String LOOKUP_LDAP = "ldap:";
    /**
     * LDAPS 遠(yuǎn)程方法調(diào)用
     */
    public static final String LOOKUP_LDAPS = "ldaps:";
    /**
     * 定時(shí)任務(wù)白名單配置(僅允許訪問(wèn)的包名,如其他需要可以自行添加)
     */
    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
    /**
     * 定時(shí)任務(wù)違規(guī)的字符
     */
    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
            "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config" };
}

創(chuàng)建Ajax請(qǐng)求工具類:

/**
 * @Description ajax結(jié)果
 */
public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;
    /** 狀態(tài)碼 */
    public static final String CODE_TAG = "code";
    /** 返回內(nèi)容 */
    public static final String MSG_TAG = "msg";
    /** 數(shù)據(jù)對(duì)象 */
    public static final String DATA_TAG = "data";
    /**
     * 初始化一個(gè)新創(chuàng)建的 AjaxResult 對(duì)象,使其表示一個(gè)空消息。
     */
    public AjaxResult()
    {
    }
    /**
     * 初始化一個(gè)新創(chuàng)建的 AjaxResult 對(duì)象
     *
     * @param code 狀態(tài)碼
     * @param msg 返回內(nèi)容
     */
    public AjaxResult(int code, String msg)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }
    /**
     * 初始化一個(gè)新創(chuàng)建的 AjaxResult 對(duì)象
     *
     * @param code 狀態(tài)碼
     * @param msg 返回內(nèi)容
     * @param data 數(shù)據(jù)對(duì)象
     */
    public AjaxResult(int code, String msg, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (data!=null)
        {
            super.put(DATA_TAG, data);
        }
    }
    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }
    /**
     * 返回成功數(shù)據(jù)
     *
     * @return 成功消息
     */
    public static AjaxResult success(Object data)
    {
        return AjaxResult.success("操作成功", data);
    }
    /**
     * 返回成功消息
     *
     * @param msg 返回內(nèi)容
     * @return 成功消息
     */
    public static AjaxResult success(String msg)
    {
        return AjaxResult.success(msg, null);
    }
    /**
     * 返回成功消息
     *
     * @param msg 返回內(nèi)容
     * @param data 數(shù)據(jù)對(duì)象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }
    /**
     * 返回警告消息
     *
     * @param msg 返回內(nèi)容
     * @return 警告消息
     */
    public static AjaxResult warn(String msg)
    {
        return AjaxResult.warn(msg, null);
    }
    /**
     * 返回警告消息
     *
     * @param msg 返回內(nèi)容
     * @param data 數(shù)據(jù)對(duì)象
     * @return 警告消息
     */
    public static AjaxResult warn(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.WARN, msg, data);
    }
    /**
     * 返回錯(cuò)誤消息
     *
     * @return 錯(cuò)誤消息
     */
    public static AjaxResult error()
    {
        return AjaxResult.error("操作失敗");
    }
    /**
     * 返回錯(cuò)誤消息
     *
     * @param msg 返回內(nèi)容
     * @return 錯(cuò)誤消息
     */
    public static AjaxResult error(String msg)
    {
        return AjaxResult.error(msg, null);
    }
    /**
     * 返回錯(cuò)誤消息
     *
     * @param msg 返回內(nèi)容
     * @param data 數(shù)據(jù)對(duì)象
     * @return 錯(cuò)誤消息
     */
    public static AjaxResult error(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }
    /**
     * 返回錯(cuò)誤消息
     *
     * @param code 狀態(tài)碼
     * @param msg 返回內(nèi)容
     * @return 錯(cuò)誤消息
     */
    public static AjaxResult error(int code, String msg)
    {
        return new AjaxResult(code, msg, null);
    }
    /**
     * 方便鏈?zhǔn)秸{(diào)用
     *
     * @param key 鍵
     * @param value 值
     * @return 數(shù)據(jù)對(duì)象
     */
    @Override
    public AjaxResult put(String key, Object value)
    {
        super.put(key, value);
        return this;
    }
}

創(chuàng)建Minio文件操作接口層:

import com.xiaohui.utils.AjaxResult;
import com.xiaohui.utils.MinioUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
/**
 * @Description minio文件上傳控制器
 */
@CrossOrigin
@RestController
@RequestMapping("/api")
public class MinioFileUploadController {
    @Autowired
    private MinioUtils minioUtils;
    /**
     * @param file     文件
     * @param fileName 文件名稱
     * @Description 上傳文件
     */
    @GetMapping("/upload")
    public AjaxResult uploadFile(@RequestParam("file") MultipartFile file, String fileName) {
        minioUtils.upload(file, fileName);
        return AjaxResult.success("上傳成功");
    }
    /**
     * @param fileName 文件名稱
     * @Description dowload文件
     */
    @GetMapping("/dowload")
    public ResponseEntity dowloadFile(@RequestParam("fileName") String fileName) {
        return minioUtils.download(fileName);
    }
    /**
     * @param fileName 文件名稱
     * @Description 得到文件url
     */
    @GetMapping("/getUrl")
    public AjaxResult getFileUrl(@RequestParam("fileName") String fileName){
        HashMap map=new HashMap();
        map.put("FileUrl",minioUtils.getFileUrl(fileName));
        return AjaxResult.success(map);
    }
}

五、測(cè)試

Minio大文件上傳:http://localhost:8080/api/upload
Minio大文件查詢:http://locahost:8080/api/getUr?fileName=測(cè)試

六、小結(jié)

minio 用來(lái)做個(gè)人云存儲(chǔ)工具完全是開(kāi)源免費(fèi)的,若當(dāng)前需要一個(gè)云存儲(chǔ)工具,首推minio。

到此這篇關(guān)于MinIO使用基礎(chǔ)教程(最新整理)的文章就介紹到這了,更多相關(guān)Minio使用教程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析k8s中各組件和kube?apiserver通信時(shí)的認(rèn)證和鑒權(quán)問(wèn)題

    淺析k8s中各組件和kube?apiserver通信時(shí)的認(rèn)證和鑒權(quán)問(wèn)題

    這篇文章主要介紹了k8s中各組件和kube?apiserver通信時(shí)的認(rèn)證和鑒權(quán),本文使用的k8s集群是用kubekey搭建,命令是./kk create cluster --with-kubernetes v1.21.5 --with-kubesphere v3.2.1,需要的朋友可以參考下
    2022-06-06
  • 一文搞懂K8S中的NodeSelector

    一文搞懂K8S中的NodeSelector

    NodeSelector是Kubernetes用于指定Pod運(yùn)行節(jié)點(diǎn)的機(jī)制,通過(guò)節(jié)點(diǎn)上的標(biāo)簽(label)來(lái)選擇性地調(diào)度Pod,增加調(diào)度的靈活性和精確性,首先需要給節(jié)點(diǎn)打上標(biāo)簽,本文給大家介紹K8S中的NodeSelector,感興趣的朋友一起看看吧
    2024-10-10
  • 一篇文章讀懂K8S的PV和PVC以及實(shí)踐攻略

    一篇文章讀懂K8S的PV和PVC以及實(shí)踐攻略

    本文詳細(xì)介紹了Kubernetes中的存儲(chǔ)卷(Volume)機(jī)制,包括PersistentVolume(PV)、PersistentVolumeClaim(PVC)及其與后端存儲(chǔ)的關(guān)系,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • K8s-helm簡(jiǎn)介及基本概念詳解

    K8s-helm簡(jiǎn)介及基本概念詳解

    ?Helm?使用的包格式稱為?chart,它是一個(gè)描述?Kubernetes?相關(guān)資源對(duì)象的文件集合,這篇文章主要介紹了K8s-helm簡(jiǎn)介及基本概念,需要的朋友可以參考下
    2022-07-07
  • 理解k8s控制器DaemonSet創(chuàng)建及使用場(chǎng)景

    理解k8s控制器DaemonSet創(chuàng)建及使用場(chǎng)景

    這篇文章主要為大家介紹了k8s控制器DaemonSet創(chuàng)建及使用場(chǎng)景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配問(wèn)題

    K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配問(wèn)題

    這篇文章主要介紹了K8s實(shí)戰(zhàn)教程之容器和?Pods資源分配,本篇文章通過(guò)配置集群中運(yùn)行的容器的?CPU?請(qǐng)求和限制,你可以有效利用集群上可用的?CPU?資源,通過(guò)將?Pod?CPU?請(qǐng)求保持在較低水平,可以使?Pod?更有機(jī)會(huì)被調(diào)度,需要的朋友可以參考下
    2022-07-07
  • Rainbond云原生部署開(kāi)源社區(qū)Discourse的配置過(guò)程

    Rainbond云原生部署開(kāi)源社區(qū)Discourse的配置過(guò)程

    這篇文章主要為大家介紹了Rainbond云原生部署開(kāi)源社區(qū)Discourse配置過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 云原生Kubernetes初始化容器Init使用教程

    云原生Kubernetes初始化容器Init使用教程

    這篇文章主要為大家介紹了云原生Kubernetes初始化容器Init使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解

    Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解

    這篇文章主要為大家介紹了Kubernetes訪問(wèn)控制之鑒權(quán)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • kubelet為cadvisor添加namespace/pod/container標(biāo)簽示例詳解

    kubelet為cadvisor添加namespace/pod/container標(biāo)簽示例詳解

    這篇文章主要為大家介紹了kubelet為cadvisor添加namespace/pod/container標(biāo)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評(píng)論