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

SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟記錄

 更新時(shí)間:2022年05月26日 10:17:29   作者:徐小白  
MinIO是一個(gè)基于Apache License v2.0開(kāi)源協(xié)議的對(duì)象存儲(chǔ)服務(wù),它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟,需要的朋友可以參考下

Minio

上傳文件如果不使用云服務(wù)的話,需要本地搭建,一般選擇 FastDFS 但是 FastDFS 安裝比較復(fù)雜,今天了解一款安裝使用更簡(jiǎn)單的存儲(chǔ)系統(tǒng) MinIO

MinIO 是一款高性能、分布式的對(duì)象存儲(chǔ)系統(tǒng). 它是一款軟件產(chǎn)品, 可以100%的運(yùn)行在標(biāo)準(zhǔn)硬件。即X86等低成本機(jī)器也能夠很好的運(yùn)行MinIO。

MinIO與傳統(tǒng)的存儲(chǔ)和其他的對(duì)象存儲(chǔ)不同的是:它一開(kāi)始就針對(duì)性能要求更高的私有云標(biāo)準(zhǔn)進(jìn)行軟件架構(gòu)設(shè)計(jì)。因?yàn)镸inIO一開(kāi)始就只為對(duì)象存儲(chǔ)而設(shè)計(jì)。所以他采用了更易用的方式進(jìn)行設(shè)計(jì),它能實(shí)現(xiàn)對(duì)象存儲(chǔ)所需要的全部功能,在性能上也更加強(qiáng)勁,它不會(huì)為了更多的業(yè)務(wù)功能而妥協(xié),失去MinIO的易用性、高效性。 這樣的結(jié)果所帶來(lái)的好處是:它能夠更簡(jiǎn)單的實(shí)現(xiàn)局有彈性伸縮能力的原生對(duì)象存儲(chǔ)服務(wù)。

MinIO在傳統(tǒng)對(duì)象存儲(chǔ)用例(例如輔助存儲(chǔ),災(zāi)難恢復(fù)和歸檔)方面表現(xiàn)出色。同時(shí),它在機(jī)器學(xué)習(xí)、大數(shù)據(jù)、私有云、混合云等方面的存儲(chǔ)技術(shù)上也獨(dú)樹(shù)一幟。當(dāng)然,也不排除數(shù)據(jù)分析、高性能應(yīng)用負(fù)載、原生云的支持。

在中國(guó):阿里巴巴、騰訊、百度、中國(guó)聯(lián)通、華為、中國(guó)移動(dòng)等等9000多家企業(yè)也都在使用MinIO產(chǎn)品

安裝 Minio

使用docker安裝

拉取鏡像

docker pull minio/minio

啟動(dòng)

docker run -p 9000:9000 -p 9001:9001 -d --name minio -v /opt/docker/minio/data:/data -v /opt/docker/minio/config:/root/.minio -e "MINIO_ROOT_USER=minio" -e "MINIO_ROOT_PASSWORD=minio@123456" minio/minio server /data --console-address ":9000" --address ":9001"

使用9000端口 登錄控制臺(tái)

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

設(shè)置桶權(quán)限

創(chuàng)建 Java 客戶端

依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>


    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- minio依賴       -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.2.1</version>
    </dependency>

    <!-- hutool工具類       -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.1.2</version>
    </dependency>

    <!-- 壓縮圖片       -->
    <dependency>
        <groupId>net.coobird</groupId>
        <artifactId>thumbnailator</artifactId>
        <version>0.4.8</version>
    </dependency>


    <!--    工具類依賴    -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>

    <dependency>
        <groupId>com.github.davidcarboni</groupId>
        <artifactId>encrypted-</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

配置文件

spring:
  application:
    name: minio-demo
  servlet:
    multipart:
      max-file-size: 20MB
      max-request-size: 200MB
server:
  port: 8088

minio:
  endpoint: http://你的ip:9001
  accessKey: minio
  secretKey: minio@123456
  nginxHost: http://你的域名

配置文件配置類

package com.sqm.minio_demo.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "minio")
@Component
@Data
public class MinioProperties {
    /**
     * 連接地址
     */
    private String endpoint;
    /**
     * 用戶名
     */
    private String accessKey;
    /**
     * 密碼
     */
    private String secretKey;
    /**
     * 域名
     */
    private String nginxHost;
}

創(chuàng)建 minio 客戶端

package com.sqm.minio_demo.config;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfig {

    @Autowired
    private MinioProperties minioProperties;

    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(minioProperties.getEndpoint())
                .credentials(minioProperties.getAccessKey(),minioProperties.getSecretKey())
                .build();
    }
}

文件地址返回路徑實(shí)體類

package com.sqm.minio_demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UploadResponse {

    private String minIoUrl;

    private String nginxUrl;
}

上傳文件工具類

package com.sqm.minio_demo.util;

import cn.hutool.core.date.DateUtil;
import com.sqm.minio_demo.config.MinioProperties;
import com.sqm.minio_demo.entity.UploadResponse;
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.Bucket;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;


import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Optional;
import java.util.Random;

@Component
@Slf4j
public class MinioUtil {

    @Autowired
    private MinioProperties minioProperties;

    @Autowired
    private MinioClient minioClient;

    private final Long maxSize = (long) (1024 * 1024);

    /**
     * 創(chuàng)建bucket
     */
    public void createBucket(String bucketName) throws Exception {
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    /**
     * 上傳文件
     */
    public UploadResponse uploadFile(MultipartFile file, String bucketName) throws Exception {
        //判斷文件是否為空
        if (null == file || 0 == file.getSize()) {
            return null;
        }
        //判斷存儲(chǔ)桶是否存在  不存在則創(chuàng)建
        createBucket(bucketName);
        //文件名
        String originalFilename = file.getOriginalFilename();
        //新的文件名 = 時(shí)間戳_隨機(jī)數(shù).后綴名
        assert originalFilename != null;
        long now = System.currentTimeMillis() / 1000;
        String fileName = DateUtil.format(DateUtil.date(),"yyyyMMdd")+"_"+ now + "_" + new Random().nextInt(1000) +
                originalFilename.substring(originalFilename.lastIndexOf("."));
        //開(kāi)始上傳
        log.info("file壓縮前大小:{}",file.getSize());
        if (file.getSize() > maxSize) {
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            FileItem fileItem = fileItemFactory.createItem(fileName, "text/plain", true, fileName);
            OutputStream outputStream = fileItem.getOutputStream();
            Thumbnails.of(file.getInputStream()).scale(1f).outputFormat(originalFilename.substring(originalFilename.lastIndexOf(".")+1)).outputQuality(0.25f).toOutputStream(outputStream);
            file = new CommonsMultipartFile(fileItem);
        }
        log.info("file壓縮后大小:{}",file.getSize());
        minioClient.putObject(
                PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                        file.getInputStream(), file.getSize(), -1)
                        .contentType(file.getContentType())
                        .build());
        String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName;
        String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName;
        return new UploadResponse(url, urlHost);
    }


    /**
     * 獲取全部bucket
     *
     * @return
     */
    public List<Bucket> getAllBuckets() throws Exception {
        return minioClient.listBuckets();
    }

    /**
     * 根據(jù)bucketName獲取信息
     *
     * @param bucketName bucket名稱
     */
    public Optional<Bucket> getBucket(String bucketName) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InvalidResponseException, InternalException, ErrorResponseException, ServerException, XmlParserException, ServerException {
        return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
    }

    /**
     * 根據(jù)bucketName刪除信息
     *
     * @param bucketName bucket名稱
     */
    public void removeBucket(String bucketName) throws Exception {
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
    }

    /**
     * 獲取?件外鏈
     *
     * @param bucketName bucket名稱
     * @param objectName ?件名稱
     * @param expires    過(guò)期時(shí)間 <=7
     * @return url
     */
    public String getObjectURL(String bucketName, String objectName, Integer expires) throws Exception {
        return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(expires).build());
    }

    /**
     * 獲取?件
     *
     * @param bucketName bucket名稱
     * @param objectName ?件名稱
     * @return ?進(jìn)制流
     */
    public InputStream getObject(String bucketName, String objectName) throws Exception {
        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 上傳?件
     *
     * @param bucketName bucket名稱
     * @param objectName ?件名稱
     * @param stream     ?件流
     * @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#putObject
     */
    public void putObject(String bucketName, String objectName, InputStream stream) throws
            Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, stream.available(), -1).contentType(objectName.substring(objectName.lastIndexOf("."))).build());
    }

    /**
     * 上傳?件
     *
     * @param bucketName  bucket名稱
     * @param objectName  ?件名稱
     * @param stream      ?件流
     * @param size        ??
     * @param contextType 類型
     * @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#putObject
     */
    public void putObject(String bucketName, String objectName, InputStream stream, long
            size, String contextType) throws Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(stream, size, -1).contentType(contextType).build());
    }

    /**
     * 獲取?件信息
     *
     * @param bucketName bucket名稱
     * @param objectName ?件名稱
     * @throws Exception https://docs.minio.io/cn/java-minioClient-api-reference.html#statObject
     */
    public StatObjectResponse getObjectInfo(String bucketName, String objectName) throws Exception {
        return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 刪除?件
     *
     * @param bucketName bucket名稱
     * @param objectName ?件名稱
     * @throws Exception https://docs.minio.io/cn/java-minioClient-apireference.html#removeObject
     */
    public void removeObject(String bucketName, String objectName) throws Exception {
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }


    /***
     * 上傳視頻
     * @param file
     * @param bucketName
     * @return
     * @throws Exception
     */
    public UploadResponse uploadVideo(MultipartFile file, String bucketName) throws Exception {
        //判斷文件是否為空
        if (null == file || 0 == file.getSize()) {
            return null;
        }
        //判斷存儲(chǔ)桶是否存在  不存在則創(chuàng)建
        createBucket(bucketName);
        //文件名
        String originalFilename = file.getOriginalFilename();
        //新的文件名 = 時(shí)間戳_隨機(jī)數(shù).后綴名
        assert originalFilename != null;
        long now = System.currentTimeMillis() / 1000;
        String fileName = DateUtil.format(DateUtil.date(),"yyyyMMdd")+"_"+ now + "_" + new Random().nextInt(1000) +
                originalFilename.substring(originalFilename.lastIndexOf("."));
        //開(kāi)始上傳
        log.info("file大小:{}",file.getSize());
        minioClient.putObject(
                PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                        file.getInputStream(), file.getSize(), -1)
                        .contentType("video/mp4")
                        .build());
        String url = minioProperties.getEndpoint() + "/" + bucketName + "/" + fileName;
        String urlHost = minioProperties.getNginxHost() + "/" + bucketName + "/" + fileName;
        return new UploadResponse(url, urlHost);
    }
}

測(cè)試上傳文件 Controller

package com.sqm.minio_demo.controller;

import com.sqm.minio_demo.entity.ResultData;
import com.sqm.minio_demo.entity.UploadResponse;
import com.sqm.minio_demo.util.MinioUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@Slf4j
public class TestController {

    @Autowired
    private MinioUtil minioUtil;

    /**
     * @author: xx
     * @date: 2022/5/25 15:32
     * @description: 上傳文件
     */
    @PostMapping("/upload")
    public ResultData minioUpload(@RequestParam(value = "file") MultipartFile file){
        UploadResponse response = null;
        try {
            response = minioUtil.uploadFile(file, "bucket01");
        } catch (Exception e) {
            log.error("上傳失敗",e);
        }
        return ResultData.ok(response);
    }

    /**
     * @author: xx
     * @date: 2022/5/25 15:32
     * @description: 上傳視頻
     */
    @PostMapping("/uploadVideo")
    public ResultData uploadVideo(@RequestParam(value = "file") MultipartFile file){
        UploadResponse response = null;
        try {
            response = minioUtil.uploadVideo(file, "video-test");
        } catch (Exception e) {
            log.error("上傳失敗",e);
        }
        return ResultData.ok(response);
    }
}

測(cè)試上傳

控制臺(tái)也可以看到上傳的視頻

總結(jié)

到此這篇關(guān)于SpringBoot整合Minio實(shí)現(xiàn)上傳文件的文章就介紹到這了,更多相關(guān)SpringBoot整合Minio上傳文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談JDK14性能管理工具之jmap和jhat

    淺談JDK14性能管理工具之jmap和jhat

    我們?cè)趯懘a的過(guò)程中,經(jīng)常會(huì)遇到內(nèi)存泄露的問(wèn)題,比如某個(gè)集合中的對(duì)象沒(méi)有被回收,或者內(nèi)存出現(xiàn)不明原因的增長(zhǎng)。這些都是需要我們來(lái)定位的問(wèn)題,我們可以使用jmap和jhat來(lái)對(duì)java程序中的內(nèi)存對(duì)象進(jìn)行分析。
    2021-06-06
  • java讀取properties配置文件的方法

    java讀取properties配置文件的方法

    這篇文章主要介紹了java讀取properties配置文件的方法,涉及java操作properties配置文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • jpa 使用@Column來(lái)定義字段類型

    jpa 使用@Column來(lái)定義字段類型

    這篇文章主要介紹了jpa使用@Column來(lái)定義字段類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳解spring security之httpSecurity使用示例

    詳解spring security之httpSecurity使用示例

    這篇文章主要介紹了詳解spring security之httpSecurity使用示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • SpringBoot實(shí)現(xiàn)過(guò)濾敏感詞的示例代碼

    SpringBoot實(shí)現(xiàn)過(guò)濾敏感詞的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用SpringBoot實(shí)現(xiàn)過(guò)濾敏感詞功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-08-08
  • 淺談Java中SimpleDateFormat 多線程不安全原因

    淺談Java中SimpleDateFormat 多線程不安全原因

    SimpleDateFormat是Java中用于日期時(shí)間格式化的一個(gè)類,本文主要介紹了淺談Java中SimpleDateFormat 多線程不安全原因,感興趣的可以了解一下
    2024-01-01
  • 關(guān)于Springboot的日志配置

    關(guān)于Springboot的日志配置

    Spring Boot默認(rèn)使用LogBack日志系統(tǒng),如果不需要更改為其他日志系統(tǒng)如Log4j2等,則無(wú)需多余的配置,LogBack默認(rèn)將日志打印到控制臺(tái)上,需要的朋友可以參考下
    2023-05-05
  • MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射

    MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射

    默認(rèn)情況下,MyBatis-Plus 是不支持直接映射 JSON 類型的,這時(shí)候就需要借助其他的方法,下面小編就來(lái)和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧
    2025-04-04
  • Spring?session?redis?修改默認(rèn)的序列化方法(案例)

    Spring?session?redis?修改默認(rèn)的序列化方法(案例)

    這篇文章主要介紹了Spring?session?redis?修改默認(rèn)的序列化方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • maven打包zip包含bin下啟動(dòng)腳本的完整代碼

    maven打包zip包含bin下啟動(dòng)腳本的完整代碼

    這篇文章主要介紹了maven打包zip包含bin下啟動(dòng)腳本,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

宾阳县| 上思县| 蒙阴县| 浑源县| 临海市| 长葛市| 普陀区| 雷州市| 寿宁县| 太康县| 保康县| 新竹县| 德令哈市| 深泽县| 济宁市| 延安市| 曲阳县| 旅游| 宁城县| 沧源| 华坪县| 威信县| 湘乡市| 康乐县| 霍林郭勒市| 台东县| 体育| 盖州市| 禹州市| 嫩江县| 鲁甸县| 阳江市| 惠州市| 靖江市| 乌什县| 玉山县| 万山特区| 长宁县| 澄江县| 正定县| 房山区|