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

SpringBoot使用minio及配置代碼

 更新時(shí)間:2022年02月07日 14:01:49   作者:快樂小洋人  
MinIO是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,類似?NodeJS,?Redis?或者?MySQL。本文重點(diǎn)給大家介紹SpringBoot使用minio及配置代碼,感興趣的朋友一起看看吧

MinIO是一個(gè)開源的對(duì)象存儲(chǔ)服務(wù)。適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個(gè)對(duì)象文件可以是任意大小,從幾kb到最大5T不等。

MinIO是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,類似 NodeJS, Redis 或者 MySQL。

1、導(dǎo)入 minio jar包

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

2、配置

application.yml 配置

minio:
  endpoint: 172.0.0.1
  port: 9000
  accessKey: minio
  secretKey: miniopassword
  secure: false
  bucketName: "my-bucket"
  configDir: "/home/data/"

類配置

/**
 * minio配置
 */
 public static class Minio{
	/**
	* minio地址
	*/
	public static String Url="http://127.0.0.1:9000";
	/**
	* AK
	*/
	public static String AccessKey="minio";
	/**
	* SK
	*/
	public static String SecretKey="miniopassword";
	/**
	 * 文件夾
 	 */
	public static String BuckeName="my-buckeName";
 }

3、實(shí)現(xiàn)

package com.minio.config;

import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.checkerframework.checker.units.qual.A;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
    @ApiModelProperty("endPoint是一個(gè)URL,域名,IPv4或者IPv6地址")
    private String endpoint;
    @ApiModelProperty("TCP/IP端口號(hào)")
    private int port;
    @ApiModelProperty("accessKey類似于用戶ID,用于唯一標(biāo)識(shí)你的賬戶")
    private String accessKey;
    @ApiModelProperty("secretKey是你賬戶的密碼")
    private String secretKey;
    @ApiModelProperty("如果是true,則用的是https而不是http,默認(rèn)值是true")
    private Boolean secure;
    @ApiModelProperty("默認(rèn)存儲(chǔ)桶")
    private String bucketName;
    @ApiModelProperty("配置目錄")
    private String configDir;
    @Bean
    public MinioClient getMinioClient() throws InvalidEndpointException, InvalidPortException {
        MinioClient minioClient = new MinioClient(endpoint, port, accessKey, secretKey,secure);
        return minioClient;
    }
}
package com.hope.minio.utils;

import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.Result;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InvalidExpiresRangeException;
import io.minio.messages.Bucket;
import io.minio.messages.DeleteError;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
 * @PackageName: com.hope.minio.utils
 * @ClassName: MinioUtil
 * @Author Hope
 * @Date 2020/7/27 11:43
 * @Description: TODO
 */
@Component
public class MinioUtil {
    @Autowired
    private MinioClient minioClient;
    private static final int DEFAULT_EXPIRY_TIME = 7 * 24 * 3600;
    /**
     * 檢查存儲(chǔ)桶是否存在
     *
     * @param bucketName 存儲(chǔ)桶名稱
     * @return
     */
    @SneakyThrows
    public boolean bucketExists(String bucketName) {
        boolean flag = false;
        flag = minioClient.bucketExists(bucketName);
        if (flag) {
            return true;
        }
        return false;
    }
     * 創(chuàng)建存儲(chǔ)桶
    public boolean makeBucket(String bucketName) {
        boolean flag = bucketExists(bucketName);
        if (!flag) {
            minioClient.makeBucket(bucketName);
        } else {
            return false;
     * 列出所有存儲(chǔ)桶名稱
    public List<String> listBucketNames() {
        List<Bucket> bucketList = listBuckets();
        List<String> bucketListName = new ArrayList<>();
        for (Bucket bucket : bucketList) {
            bucketListName.add(bucket.name());
        return bucketListName;
     * 列出所有存儲(chǔ)桶
    public List<Bucket> listBuckets() {
        return minioClient.listBuckets();
     * 刪除存儲(chǔ)桶
    public boolean removeBucket(String bucketName) {
            Iterable<Result<Item>> myObjects = listObjects(bucketName);
            for (Result<Item> result : myObjects) {
                Item item = result.get();
                // 有對(duì)象文件,則刪除失敗
                if (item.size() > 0) {
                    return false;
                }
            }
            // 刪除存儲(chǔ)桶,注意,只有存儲(chǔ)桶為空時(shí)才能刪除成功。
            minioClient.removeBucket(bucketName);
            flag = bucketExists(bucketName);
            if (!flag) {
                return true;
     * 列出存儲(chǔ)桶中的所有對(duì)象名稱
    public List<String> listObjectNames(String bucketName) {
        List<String> listObjectNames = new ArrayList<>();
                listObjectNames.add(item.objectName());
        return listObjectNames;
     * 列出存儲(chǔ)桶中的所有對(duì)象
    public Iterable<Result<Item>> listObjects(String bucketName) {
            return minioClient.listObjects(bucketName);
        return null;
     * 通過文件上傳到對(duì)象
     * @param objectName 存儲(chǔ)桶里的對(duì)象名稱
     * @param fileName   File name
    public boolean putObject(String bucketName, String objectName, String fileName) {
            minioClient.putObject(bucketName, objectName, fileName, null);
            ObjectStat statObject = statObject(bucketName, objectName);
            if (statObject != null && statObject.length() > 0) {
     * 文件上傳
     * @param bucketName
     * @param multipartFile
    public void putObject(String bucketName, MultipartFile multipartFile, String filename) {
        PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
        putObjectOptions.setContentType(multipartFile.getContentType());
        minioClient.putObject(bucketName, filename, multipartFile.getInputStream(), putObjectOptions);
     * 通過InputStream上傳對(duì)象
     * @param stream     要上傳的流
    public boolean putObject(String bucketName, String objectName, InputStream stream) {
            minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), -1));
     * 以流的形式獲取一個(gè)文件對(duì)象
    public InputStream getObject(String bucketName, String objectName) {
                InputStream stream = minioClient.getObject(bucketName, objectName);
                return stream;
     * 以流的形式獲取一個(gè)文件對(duì)象(斷點(diǎn)下載)
     * @param offset     起始字節(jié)的位置
     * @param length     要讀取的長(zhǎng)度 (可選,如果無值則代表讀到文件結(jié)尾)
    public InputStream getObject(String bucketName, String objectName, long offset, Long length) {
                InputStream stream = minioClient.getObject(bucketName, objectName, offset, length);
     * 下載并將文件保存到本地
    public boolean getObject(String bucketName, String objectName, String fileName) {
                minioClient.getObject(bucketName, objectName, fileName);
     * 刪除一個(gè)對(duì)象
    public boolean removeObject(String bucketName, String objectName) {
            minioClient.removeObject(bucketName, objectName);
     * 刪除指定桶的多個(gè)文件對(duì)象,返回刪除錯(cuò)誤的對(duì)象列表,全部刪除成功,返回空列表
     * @param bucketName  存儲(chǔ)桶名稱
     * @param objectNames 含有要?jiǎng)h除的多個(gè)object名稱的迭代器對(duì)象
    public List<String> removeObject(String bucketName, List<String> objectNames) {
        List<String> deleteErrorNames = new ArrayList<>();
            Iterable<Result<DeleteError>> results = minioClient.removeObjects(bucketName, objectNames);
            for (Result<DeleteError> result : results) {
                DeleteError error = result.get();
                deleteErrorNames.add(error.objectName());
        return deleteErrorNames;
     * 生成一個(gè)給HTTP GET請(qǐng)求用的presigned URL。
     * 瀏覽器/移動(dòng)端的客戶端可以用這個(gè)URL進(jìn)行下載,即使其所在的存儲(chǔ)桶是私有的。這個(gè)presigned URL可以設(shè)置一個(gè)失效時(shí)間,默認(rèn)值是7天。
     * @param expires    失效時(shí)間(以秒為單位),默認(rèn)是7天,不得大于七天
    public String presignedGetObject(String bucketName, String objectName, Integer expires) {
        String url = "";
            if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) {
                throw new InvalidExpiresRangeException(expires,
                        "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);
            url = minioClient.presignedGetObject(bucketName, objectName, expires);
        return url;
     * 生成一個(gè)給HTTP PUT請(qǐng)求用的presigned URL。
     * 瀏覽器/移動(dòng)端的客戶端可以用這個(gè)URL進(jìn)行上傳,即使其所在的存儲(chǔ)桶是私有的。這個(gè)presigned URL可以設(shè)置一個(gè)失效時(shí)間,默認(rèn)值是7天。
    public String presignedPutObject(String bucketName, String objectName, Integer expires) {
            url = minioClient.presignedPutObject(bucketName, objectName, expires);
     * 獲取對(duì)象的元數(shù)據(jù)
    public ObjectStat statObject(String bucketName, String objectName) {
            ObjectStat statObject = minioClient.statObject(bucketName, objectName);
            return statObject;
     * 文件訪問路徑
    public String getObjectUrl(String bucketName, String objectName) {
            url = minioClient.getObjectUrl(bucketName, objectName);
    public void downloadFile(String bucketName, String fileName, String originalName, HttpServletResponse response) {
        try {
            InputStream file = minioClient.getObject(bucketName, fileName);
            String filename = new String(fileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);
            if (StringUtils.isNotEmpty(originalName)) {
                fileName = originalName;
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            ServletOutputStream servletOutputStream = response.getOutputStream();
            int len;
            byte[] buffer = new byte[1024];
            while ((len = file.read(buffer)) > 0) {
                servletOutputStream.write(buffer, 0, len);
            servletOutputStream.flush();
            file.close();
            servletOutputStream.close();
        } catch (ErrorResponseException e) {
            e.printStackTrace();
        } catch (Exception e) {
}

注意:存儲(chǔ)桶命名要求
存儲(chǔ)桶的命名需符合以下一個(gè)或多個(gè)規(guī)則
. 存儲(chǔ)桶名稱的長(zhǎng)度介于 3 和 63 個(gè)字符之間,并且只能包含小寫字母、數(shù)字、句點(diǎn)和短劃線。
. 存儲(chǔ)桶名稱中的每個(gè)標(biāo)簽必須以小寫字母或數(shù)字開頭。
. 存儲(chǔ)桶名稱不能包含下劃線、以短劃線結(jié)束、包含連續(xù)句點(diǎn)或在句點(diǎn)旁邊使用短劃線。
. 存儲(chǔ)桶名稱不能采用 IP 地址格式 (198.51.100.24)。
. 存儲(chǔ)桶用作可公開訪問的 URL,因此您選擇的存儲(chǔ)桶名稱必須具有全局唯一性。如果您選擇的名稱已被其他一些帳戶用于創(chuàng)建存儲(chǔ)桶,則必須使用其他名稱。

參考地址:
https://blog.csdn.net/weixin_37264997/article/details/107631796

到此這篇關(guān)于SpringBoot使用minio及配置代碼的文章就介紹到這了,更多相關(guān)SpringBoot使用minio內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring AOP在web應(yīng)用中的使用方法實(shí)例

    Spring AOP在web應(yīng)用中的使用方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Spring AOP在web應(yīng)用中的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring AOP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • SpringBoot+Elasticsearch實(shí)現(xiàn)數(shù)據(jù)搜索的方法詳解

    SpringBoot+Elasticsearch實(shí)現(xiàn)數(shù)據(jù)搜索的方法詳解

    Elasticsearch是一個(gè)基于Lucene的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful?web接口。本文將利用SpringBoot整合Elasticsearch實(shí)現(xiàn)海量級(jí)數(shù)據(jù)搜索,需要的可以參考一下
    2022-05-05
  • Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過程解析

    Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過程解析

    這篇文章主要介紹了Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring?Cache?集成?Caffeine實(shí)現(xiàn)項(xiàng)目緩存的示例

    Spring?Cache?集成?Caffeine實(shí)現(xiàn)項(xiàng)目緩存的示例

    本文主要介紹了Spring?Cache?集成?Caffeine實(shí)現(xiàn)項(xiàng)目緩存的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Spring boot集中異常處理方法實(shí)例

    Spring boot集中異常處理方法實(shí)例

    這篇文章主要介紹了Spring boot集中異常處理方法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springboot+springJdbc+postgresql 實(shí)現(xiàn)多數(shù)據(jù)源的配置

    springboot+springJdbc+postgresql 實(shí)現(xiàn)多數(shù)據(jù)源的配置

    本文主要介紹了springboot+springJdbc+postgresql 實(shí)現(xiàn)多數(shù)據(jù)源的配置,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java編程中ArrayList源碼分析

    Java編程中ArrayList源碼分析

    這篇文章主要介紹了Java編程中ArrayList源碼分析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • java實(shí)現(xiàn)插入排序算法

    java實(shí)現(xiàn)插入排序算法

    插入排序算法是一個(gè)對(duì)少量元素進(jìn)行排序的有效算法。插入排序的工作原理與打牌時(shí)整理手中的牌的做法類似,開始摸牌時(shí),我們的左手是空的,接著一次從桌上摸起一張牌,并將它插入到左手的正確位置。
    2015-04-04
  • SpringBoot使用knife4j進(jìn)行在線接口調(diào)試

    SpringBoot使用knife4j進(jìn)行在線接口調(diào)試

    這篇文章主要介紹了SpringBoot使用knife4j進(jìn)行在線接口調(diào)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot+WebSocket實(shí)現(xiàn)IM及時(shí)通訊的代碼示例

    SpringBoot+WebSocket實(shí)現(xiàn)IM及時(shí)通訊的代碼示例

    項(xiàng)目中碰到需要及時(shí)通訊的場(chǎng)景,使用springboot集成websocket,即可實(shí)現(xiàn)簡(jiǎn)單的及時(shí)通訊,本文介紹springboot如何集成websocket、IM及時(shí)通訊需要哪些模塊、開發(fā)和部署過程中遇到的問題、以及實(shí)現(xiàn)小型IM及時(shí)通訊的代碼,需要的朋友可以參考下
    2023-10-10

最新評(píng)論