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

springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼

 更新時(shí)間:2024年02月29日 15:10:27   作者:今年不養(yǎng)豬只除草  
本文主要介紹了springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

安裝minio

首先點(diǎn)擊進(jìn)入MINIO官網(wǎng),進(jìn)行一個(gè)minio服務(wù)器的下載

在這里插入圖片描述

下載好了之后在本地磁盤(pán)找一個(gè)文件夾,把下載的exe放入文件夾,再新建一個(gè)文件夾準(zhǔn)備存放數(shù)據(jù)和文件

在這里插入圖片描述

在當(dāng)前目錄cmd進(jìn)入控制臺(tái),輸入代碼

minio.exe server data

成功后會(huì)有訪問(wèn)路徑以及賬號(hào)密碼

在這里插入圖片描述

訪問(wèn)這個(gè)路徑,輸入剛剛控制臺(tái)打印的賬號(hào)密碼就可以進(jìn)入

http://127.0.0.1:9000

在這里插入圖片描述

進(jìn)入后創(chuàng)建buckets

在這里插入圖片描述

在這里插入圖片描述

后端

在官網(wǎng)找到依賴(lài)并導(dǎo)入

在這里插入圖片描述

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

添加yml文件配置

# Minio配置 wyj配置
minio:
  endpoint: http://127.0.0.1:9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucketName: svt-ttt

MinIoClientConfig配置文件

這里bean文件只能有這一個(gè),如果是多人團(tuán)隊(duì)項(xiàng)目開(kāi)發(fā)記得在測(cè)試的時(shí)候協(xié)商好
@Value的注解導(dǎo)入是spring的原生注解

package com.wedu.config;

import io.minio.MinioClient;
import lombok.Data;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/*
 * Minio的配置類(lèi)
 * */
@Data
@Component
public class MinIoClientConfig {
    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.bucket-name}")
    private String bucketName;
    /**
     * 注入minio 客戶(hù)端
     *
     * @return
     */
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }

}

工具類(lèi)MinIOUtil

工具類(lèi)里有很多可使用的方法,這里只用到了uploadFile

package com.wedu.modules.tain.utils;

import com.amazonaws.util.IOUtils;
import com.wedu.modules.equi.entity.ObjectItem;
import io.minio.*;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
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.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class MinIOUtil {
    @Autowired
    private MinioClient minioClient;

    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.access-key}")
    private String accessKey;
    @Value("${minio.secret-key}")
    private String secretKey;
    @Value("${minio.bucket-name}")
    private String bucketName;

    /**
     * 上傳文件到指定的存儲(chǔ)桶中
     *
     * @param bucketName 存儲(chǔ)桶名稱(chēng)
     * @param file 上傳的文件
     * @param objectName 存儲(chǔ)對(duì)象的名稱(chēng)
     * @param contentType 文件的內(nèi)容類(lèi)型
     * @return 文件上傳的響應(yīng)對(duì)象
     * @throws Exception 如果上傳過(guò)程中發(fā)生異常
     */
    @SneakyThrows(Exception.class)
    public ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, String objectName, String contentType) {
        InputStream inputStream = file.getInputStream();
        return minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .contentType(contentType)
                        .stream(inputStream, inputStream.available(), -1)
                        .build());
    }

    /**
     * description: 判斷bucket是否存在,不存在則創(chuàng)建
     *
     * @return: void
     */
    public void existBucket(String name) {
        try {
            boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
            if (!exists) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 創(chuàng)建存儲(chǔ)bucket
     * @param bucketName 存儲(chǔ)bucket名稱(chēng)
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 刪除存儲(chǔ)bucket
     * @param bucketName 存儲(chǔ)bucket名稱(chēng)
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * description: 上傳文件
     *
     * @param multipartFile
     * @return: java.lang.String

     */
    public List<String> upload(MultipartFile[] multipartFile) {
        List<String> names = new ArrayList<>(multipartFile.length);
        for (MultipartFile file : multipartFile) {
            String fileName = file.getOriginalFilename();
            String[] split = fileName.split("\\.");
            if (split.length > 1) {
                fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1];
            } else {
                fileName = fileName + System.currentTimeMillis();
            }
            InputStream in = null;
            try {
                in = file.getInputStream();
                minioClient.putObject(PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .stream(in, in.available(), -1)
                        .contentType(file.getContentType())
                        .build()
                );
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            names.add(fileName);
        }
        return names;
    }

    /**
     * description: 下載文件
     *
     * @param fileName
     * @return: org.springframework.http.ResponseEntity<byte [ ]>
     */
    public ResponseEntity<byte[]> download(String fileName) {
        ResponseEntity<byte[]> responseEntity = null;
        InputStream in = null;
        ByteArrayOutputStream out = null;
        try {
            in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).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.OK);
        } 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;
    }

    /**
     * 查看文件對(duì)象
     * @param bucketName 存儲(chǔ)bucket名稱(chēng)
     * @return 存儲(chǔ)bucket內(nèi)文件對(duì)象信息
     */
    public List<ObjectItem> listObjects(String bucketName) {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucketName).build());
        List<ObjectItem> objectItems = new ArrayList<>();
        try {
            for (Result<Item> result : results) {
                Item item = result.get();
                ObjectItem objectItem = new ObjectItem();
                objectItem.setObjectName(item.objectName());
                objectItem.setSize(item.size());
                objectItems.add(objectItem);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return objectItems;
    }

    /**
     * 批量刪除文件對(duì)象
     * @param bucketName 存儲(chǔ)bucket名稱(chēng)
     * @param objects 對(duì)象名稱(chēng)集合
     */
    public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {
        List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
        return results;
    }
}

controller調(diào)用uploadFile

    @Autowired
    private MinIOUtil minIOUtil;
    @Autowired
    private MinIoClientConfig minIoClientConfig;
    //minio
    @PostMapping("/minIoUpload")
    public R minIoUpload(@RequestParam("file") MultipartFile file) throws IOException {
        //文件名
        String fileName = file.getOriginalFilename();
        String newFileName = System.currentTimeMillis() + "." + StringUtils.substringAfterLast(fileName, ".");
        //類(lèi)型
        String contentType = file.getContentType();
        minIOUtil.uploadFile(minIoClientConfig.getBucketName(), file, newFileName, contentType);
        return R.ok("上傳成功");
    }

postman測(cè)試

測(cè)試成功

在這里插入圖片描述

在這里插入圖片描述

前端

主頁(yè)面和springboot+vue實(shí)現(xiàn)oss文件存儲(chǔ)一樣,在彈窗的下拉框中添加一個(gè)2,訪問(wèn)路徑變?yōu)樽约旱膒ost的訪問(wèn)路徑即可

到此這篇關(guān)于springboot+vue實(shí)現(xiàn)Minio文件存儲(chǔ)的示例代碼的文章就介紹到這了,更多相關(guān)springboot vueMinio文件存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot實(shí)現(xiàn)異步任務(wù)

    springboot實(shí)現(xiàn)異步任務(wù)

    這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)異步任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • java生成驗(yàn)證碼圖片的方法

    java生成驗(yàn)證碼圖片的方法

    這篇文章主要為大家詳細(xì)介紹了java生成驗(yàn)證碼圖片的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 如何在Spring MVC中查詢(xún)字符串與參數(shù)

    如何在Spring MVC中查詢(xún)字符串與參數(shù)

    本文給大家介紹在Spring MVC中查詢(xún)字符串與參數(shù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-09-09
  • Maven-POM文件及組成部分

    Maven-POM文件及組成部分

    POM是用于描述Maven項(xiàng)目的配置文件,它包含了項(xiàng)目構(gòu)建、依賴(lài)管理和其他相關(guān)配置的信息,這篇文章主要介紹了Maven-POM文件,需要的朋友可以參考下
    2023-06-06
  • Spring框架事務(wù)屬性中事務(wù)隔離級(jí)別與傳播行為全面講解

    Spring框架事務(wù)屬性中事務(wù)隔離級(jí)別與傳播行為全面講解

    這篇文章主要介紹了Spring框架聲明式事務(wù)的事務(wù)隔離級(jí)別和事務(wù)傳播行為,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • 通過(guò)Java計(jì)算文件的MD5值實(shí)現(xiàn)方式

    通過(guò)Java計(jì)算文件的MD5值實(shí)現(xiàn)方式

    本文將詳細(xì)介紹如何使用Java語(yǔ)言來(lái)計(jì)算文件的MD5值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java中的ConcurrentHashMap原理詳解

    Java中的ConcurrentHashMap原理詳解

    這篇文章主要介紹了Java中的ConcurrentHashMap原理詳解,ConcurrentHashMap和HashMap一樣,是一個(gè)存放鍵值對(duì)的容器,使用hash算法來(lái)獲取值的地址,因此時(shí)間復(fù)雜度是O(1),查詢(xún)非???需要的朋友可以參考下
    2023-12-12
  • Java源碼重讀之ConcurrentHashMap詳解

    Java源碼重讀之ConcurrentHashMap詳解

    ConcurrentHashMap(CHM)是日常開(kāi)發(fā)中使用頻率非常高的一種數(shù)據(jù)結(jié)構(gòu)。本文將從源碼角度帶大家深入了解一下ConcurrentHashMap的使用,需要的可以收藏一下
    2023-05-05
  • 一篇文章教你學(xué)會(huì)用Java程序操作文件及避坑指南

    一篇文章教你學(xué)會(huì)用Java程序操作文件及避坑指南

    文件的讀取與寫(xiě)入操作是Java開(kāi)發(fā)中的基礎(chǔ)且重要的一環(huán),從傳統(tǒng)的字節(jié)流與字符流到高級(jí)的緩沖流與NIO,每種技術(shù)都有其適用場(chǎng)景和優(yōu)缺點(diǎn),這篇文章主要介紹了用Java程序操作文件及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2026-06-06
  • Spring Boot 微服務(wù)架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)代碼

    Spring Boot 微服務(wù)架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)代碼

    這篇文章主要介紹了本文介紹了SpringBoot微服務(wù)架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)的核心概念與使用方法,重點(diǎn)內(nèi)容包括微服務(wù)架構(gòu)的定義與特點(diǎn)、SpringBoot與微服務(wù)的集成、SpringBoot與微服務(wù)的配置和基本方法,感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評(píng)論

康马县| 葫芦岛市| 遂溪县| 壶关县| 乌兰察布市| 深州市| 东乌| 南宁市| 洪江市| 金华市| 依安县| 河北省| 革吉县| 宣威市| 久治县| 溧水县| 若羌县| 石门县| 潜江市| 杂多县| 格尔木市| 南宫市| 新绛县| 民和| 西华县| 静安区| 邵阳县| 乌恰县| 永泰县| 稻城县| 哈尔滨市| 古交市| 仙居县| 静海县| 六枝特区| 如东县| 徐闻县| 抚顺县| 招远市| 含山县| 莒南县|