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

Java項目中MinIO使用超全流程(含完整示例)

 更新時間:2026年04月14日 08:16:49   作者:章魚哥730  
MinIO是全球領(lǐng)先的對象存儲先鋒,目前在全世界有數(shù)百萬的用戶,這篇文章主要介紹了Java項目中MinIO使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、前言

在現(xiàn)代微服務(wù)架構(gòu)中,文件存儲 是非常常見的業(yè)務(wù)場景。

傳統(tǒng)的文件存儲(比如本地磁盤、FTP)已經(jīng)無法滿足高可用、高擴展的需求。

這時候,對象存儲系統(tǒng)(Object Storage) 就成為了首選方案,而 MinIO 是其中最輕量、最易用、且兼容 S3 協(xié)議的解決方案之一。

本文將帶你從零開始,使用 Java(尤其是 Spring Boot 項目)集成 MinIO,實現(xiàn):

  • ? 文件上傳與下載

  • ? 文件預(yù)覽鏈接生成

  • ? 判斷文件是否存在

  • ? 刪除文件

二、MinIO 簡介

MinIO 是一個高性能、分布式對象存儲服務(wù),支持 S3 API,可以輕松部署在本地或云服務(wù)器上。

無論是文件存儲、AI 訓(xùn)練數(shù)據(jù)、日志歸檔、圖片/視頻等,都非常適用。

特點

  • 100% 兼容 Amazon S3 API

  • 支持本地部署

  • 高性能(可達 NAS 的吞吐)

  • 開源免費

三、引入依賴

pom.xml 中添加以下依賴:

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

?? 建議使用 8.x+ 版本,API 更現(xiàn)代,支持 try-with-resources 自動關(guān)閉流。

四、配置 MinIO 連接信息

在你的 application.yml 中加入以下配置:

minio:
  endpoint: http://127.0.0.1:9000
  access-key: admin
  secret-key: 12345678
  bucket-name: my-bucket

五、編寫配置類

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.access-key}")
    private String accessKey;
    @Value("${minio.secret-key}")
    private String secretKey;
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
}

六、封裝工具類(核心代碼)

import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;
@Component
public class MinioUtil {
    private final MinioClient minioClient;
    @Value("${minio.bucket-name}")
    private String bucketName;
    public MinioUtil(MinioClient minioClient) {
        this.minioClient = minioClient;
    }
    /** 上傳文件 **/
    public String upload(MultipartFile file) throws Exception {
        String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();
        try (InputStream inputStream = file.getInputStream()) {
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .stream(inputStream, file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build()
            );
        }
        return fileName;
    }
    /** 獲取文件訪問URL **/
    public String getFileUrl(String fileName) throws Exception {
        return minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(fileName)
                        .expiry(7, TimeUnit.DAYS)
                        .build()
        );
    }
    /** 刪除文件 **/
    public void remove(String fileName) throws Exception {
        minioClient.removeObject(
                RemoveObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .build()
        );
    }
    /** 判斷文件是否存在 **/
    public boolean exists(String fileName) {
        try {
            minioClient.statObject(
                    StatObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .build()
            );
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

七、Controller 示例

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class FileController {
    private final MinioUtil minioUtil;
    @PostMapping("/upload")
    public String upload(@RequestParam MultipartFile file) throws Exception {
        return minioUtil.upload(file);
    }
    @GetMapping("/url/{fileName}")
    public String getUrl(@PathVariable String fileName) throws Exception {
        return minioUtil.getFileUrl(fileName);
    }
    @DeleteMapping("/{fileName}")
    public void delete(@PathVariable String fileName) throws Exception {
        minioUtil.remove(fileName);
    }
}

八、常見問題與優(yōu)化建議

1、上傳大文件時報錯?

MinIO 默認(rèn)分片上傳上限為 5GB。超過建議使用 分片上傳 API 或者配置 Nginx 轉(zhuǎn)發(fā)大文件。

2、中文文件名亂碼?

可在上傳時 URLEncoder.encode(fileName, "UTF-8")。

3、安全性考慮

  • 上傳時可自定義路徑前綴(如 userId/xxx.png);

  • 下載使用 getPresignedObjectUrl 臨時簽名,而非公開 URL;

  • 不建議讓前端直接知道 accessKey / secretKey

九、實戰(zhàn)建議

  1. ? 將上傳邏輯抽象為 FileService 接口,方便后續(xù)替換為 OSS、COS 等云服務(wù)。

  2. ? 對 URL 做緩存(比如 Redis)減少簽名生成壓力。

  3. ? 搭配 Nginx 做靜態(tài)文件反代,更安全更快。

  4. ? 日志中不要輸出 accessKey。

結(jié)語

MinIO 是一款輕量級、高性能的對象存儲系統(tǒng),非常適合在 Java / SpringBoot 項目中快速接入。

無論是內(nèi)部文檔管理、AI 訓(xùn)練數(shù)據(jù)、還是企業(yè)文件中臺,它都能勝任。

相關(guān)文章

  • shade解決mybatis包沖突問題及項目引用的方法

    shade解決mybatis包沖突問題及項目引用的方法

    這篇文章主要介紹了shade解決mybatis包沖突問題及項目引用的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    這篇文章主要介紹了Java Optional解決空指針異??偨Y(jié)(java 8 功能),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • spring boot RestTemplate 發(fā)送get請求的踩坑及解決

    spring boot RestTemplate 發(fā)送get請求的踩坑及解決

    這篇文章主要介紹了spring boot RestTemplate 發(fā)送get請求的踩坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java常見面試題以及答案匯總大全(2025最新版)

    Java常見面試題以及答案匯總大全(2025最新版)

    這篇文章主要介紹了Java常見面試題及答案匯總的相關(guān)資料,適合準(zhǔn)備求職、或者有跳槽想法的初/中/高級程序員,也合適想要對自己技術(shù)棧查缺補漏、不斷完善成長的人,需要的朋友可以參考下
    2026-04-04
  • MyBatis核心配置文件深入分析

    MyBatis核心配置文件深入分析

    這篇文章主要介紹了MyBatis核心配置文件,MyBatis的前身就是iBatis,iBatis本是由Clinton Begin開發(fā),后來捐給Apache基金會,成立了iBatis開源項目。2010年5月該項目由Apahce基金會遷移到了Google Code,并且改名為MyBatis
    2022-12-12
  • 一文詳解Java線程安全的集合有哪些

    一文詳解Java線程安全的集合有哪些

    在Java中線程安全的集合類對于多線程編程至關(guān)重要,它們能夠確保在多個線程同時訪問集合時數(shù)據(jù)的一致性和完整性,下面這篇文章主要介紹了Java線程安全集合有哪些的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • java字符串相加時的內(nèi)存表現(xiàn)和原理分析

    java字符串相加時的內(nèi)存表現(xiàn)和原理分析

    這篇文章主要介紹了java字符串相加時的內(nèi)存表現(xiàn)和原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java微服務(wù)開發(fā)之Swagger詳解

    Java微服務(wù)開發(fā)之Swagger詳解

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)??傮w目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2021-10-10
  • java高級用法之注解和反射講義

    java高級用法之注解和反射講義

    這篇文章主要給大家介紹了關(guān)于java高級用法之注解和反射講義的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • SpringMVC的執(zhí)行流程及組件詳解

    SpringMVC的執(zhí)行流程及組件詳解

    這篇文章主要介紹了SpringMVC的執(zhí)行流程及組件詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論

高尔夫| 南宫市| 富平县| 如皋市| 克拉玛依市| 盘锦市| 潮安县| 龙里县| 鄱阳县| 双鸭山市| 阿克| 黄龙县| 酉阳| 白玉县| 衡阳县| 绥江县| 四川省| 清新县| 沙湾县| 绍兴市| 民乐县| 余干县| 海原县| 惠水县| 郴州市| 奉新县| 隆子县| 扎囊县| 扎兰屯市| 灵丘县| 堆龙德庆县| 门头沟区| 尚志市| 洛阳市| 思茅市| 霍城县| 龙陵县| 罗甸县| 陆河县| 仁怀市| 汾阳市|