MinIO快速入门:开启你的文件存储之旅

在现代应用中,文件存储服务是至关重要的组件之一。像腾讯云的COS(对象存储服务)等云存储服务提供了丰富的功能,但随之而来的云端费用也是开发者无法忽视的问题。本文将介绍一款开源、高性能的对象存储服务——MinIO,它既能节省费用,又提供了与COS类似的体验。接着,我们会详细讲解如何在Spring Boot项目中集成MinIO,方便开发者轻松管理文件存储。

1. MinIO简介

MinIO是一款高性能的分布式对象存储服务,设计兼容亚马逊S3协议。它的轻量级和开源性质使其成为本地开发和自托管环境中的绝佳选择。与腾讯云的COS相比,MinIO有以下几个优势:

  1. 节省成本:腾讯云COS等云服务按存储容量和流量计费,而MinIO可以自托管,消除了云平台的高昂费用,尤其适用于开发、测试和本地部署场景。

  2. 高度兼容:MinIO完全兼容S3 API,意味着如果你的应用已经集成了COS或其他对象存储服务,迁移到MinIO的成本极低。

  3. 灵活性与控制:MinIO可以根据业务需求灵活扩展,允许你在本地或私有云中自由控制数据存储和权限管理。

2. 启动MinIO文件存储服务

为了使用MinIO,首先需要启动MinIO服务。MinIO提供了简单的启动命令和官方的Docker镜像,使得部署非常方便。以下是启动步骤:

  1. 安装MinIO
    你可以从MinIO的GitHub开源地址下载最新的版本,使用以下命令在 服务器上下载并运行独立的 MinIO 服务器。将/data替换为你希望 MinIO 存储数据的驱动器或目录的路径

    wget https://dl.min.io/server/minio/release/darwin-amd64/minio
    chmod +x minio
    ./minio server /data
    

    在这里插入图片描述

  2. 访问MinIO控制台

    MinIO启动后,你可以通过浏览器访问http://localhost:9000,并使用默认的用户名和密码登录(用户名:minioadmin,密码:minioadmin)。类似于常见的对象存储服务(如阿里云OSS或腾讯云COS),MinIO的Web控制台也提供了文件上传、下载、管理和权限控制等功能。
    在这里插入图片描述

  3. 创建Access Key

    登录MinIO后,可以创建一个新的Access Key,这个Access Key和Secret Key将用于集成到Spring Boot项目中。此外,MinIO支持创建多个用户并为其分配不同的权限,以实现权限隔离。例如,你可以为不同的用户分配只读权限或读写权限,从而精细化控制数据的访问。
    在这里插入图片描述

  4. 监控与管理

    MinIO还提供了控制台来监控存储健康状况、I/O性能等指标。通过控制台,你可以轻松跟踪系统负载和存储的状态,保证系统的稳定运行。

3. 在Spring Boot中集成MinIO

在集成MinIO之前,确保已经通过控制台创建了必要的Access Key和Secret Key,并记录下这些值以供Spring Boot项目使用。

1. 添加依赖

pom.xml中添加MinIO的依赖:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.6</version>
</dependency>
2. 配置MinIO

创建application.propertiesapplication.yml文件来配置MinIO的连接信息:

minio.url=http://localhost:9000
minio.accessKey=yourAccessKey
minio.secretKey=yourSecretKey
minio.bucketName=my-bucket
3. MinioConfig配置类

首先,我们需要创建一个配置类,用于初始化MinIO客户端:

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.url}")
    private String minioUrl;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(minioUrl)
                .credentials(accessKey, secretKey)
                .build();
    }
}
4. MinIO工具类

为了方便业务层和控制层调用MinIO功能,可以编写一个工具类封装MinIO的常用操作,例如创建存储桶、上传文件、下载文件和删除文件。

import io.minio.*;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

@Component
public class MinioUtils {

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucketName}")
    private String bucketName;

    // 创建存储桶
    public void createBucket() throws Exception {
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!isExist) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    // 上传文件
    public String uploadFile(MultipartFile file) throws Exception {
        String fileName = file.getOriginalFilename();
        minioClient.putObject(
            PutObjectArgs.builder().bucket(bucketName)
                .object(fileName)
                .stream(file.getInputStream(), file.getSize(), -1)
                .contentType(file.getContentType())
                .build()
        );
        return fileName;
    }

    // 下载文件
    public InputStream downloadFile(String fileName) throws Exception {
        return minioClient.getObject(
            GetObjectArgs.builder().bucket(bucketName).object(fileName).build()
        );
    }

    // 删除文件
    public void deleteFile(String fileName) throws Exception {
        minioClient.removeObject(
            RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build()
        );
    }
}
5. 控制器层

最后,创建一个简单的控制器来提供API接口,供外部系统调用MinIO的上传、下载、删除等功能:

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.io.InputStream;

@RestController
@RequestMapping("/files")
public class MinioController {

    @Autowired
    private MinioUtils minioUtils;
	
	// 创建存储桶
    @PostMapping("/create-bucket")
    public ResponseEntity<String> createBucket() {
        try {
            minioUtils.createBucket();
            return ResponseEntity.ok("Bucket created successfully.");
        } catch (Exception e) {
            return ResponseEntity.status(500).body("Bucket creation failed: " + e.getMessage());
        }
    }
	
	// 上传文件
    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            String fileName = minioUtils.uploadFile(file);
            return ResponseEntity.ok("File uploaded successfully: " + fileName);
        } catch (Exception e) {
            return ResponseEntity.status(500).body("Upload failed: " + e.getMessage());
        }
    }

	// 下载文件
    @GetMapping("/download/{fileName}")
    public ResponseEntity<InputStream> downloadFile(@PathVariable String fileName) {
        try {
            InputStream fileStream = minioUtils.downloadFile(fileName);
            return ResponseEntity.ok().body(fileStream);
        } catch (Exception e) {
            return ResponseEntity.status(500).body(null);
        }
    }
	
	// 删除文件
    @DeleteMapping("/delete/{fileName}")
    public ResponseEntity<String> deleteFile(@PathVariable String fileName) {
        try {
            minioUtils.deleteFile(fileName);
            return ResponseEntity.ok("File deleted successfully: " + fileName);
        } catch (Exception e) {
            return ResponseEntity.status(500).body("Deletion failed: " + e.getMessage());
        }
    }
}

MinIO不仅以开源的姿态帮助开发者节省成本,更提供了媲美腾讯云COS的高性能对象存储体验。通过它,你可以在本地或私有云环境中轻松构建出稳定、灵活的文件存储解决方案。而且,结合Spring Boot的集成,你可以快速实现上传、下载、删除、创建存储桶等核心功能,大幅提升开发效率。

还在犹豫是否需要一款更经济、更灵活的存储解决方案吗?行动永远是最好的答案!立即尝试MinIO,打造属于你自己的高效文件管理系统,彻底掌控数据存储的每一环节。未来的存储体验,由你定义!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【含开题报告+文档+PPT+源码】基于SSM框架的诗词吟诵知识学习系统的设计与实现

开题报告 随着信息技术的迅猛发展和互联网的普及&#xff0c;在线教育逐渐成为现代教育的重要形式。在线学习平台以其便捷性、灵活性和个性化等特点&#xff0c;受到广大师生的青睐。特别是在线吟诵知识学习&#xff0c;已经成为许多学生提升自我修养、陶冶情操的重要途径。青…

基于华为云CodeArts Repo和流水线门禁的分支合并与部署

本文分享自华为云社区《【开发者空间实践】基于Repo和流水线门禁的分支合并与部署-云社区-华为云》 一、案例介绍 流水线&#xff08;CodeArts Pipeline&#xff09;提供可视化、可编排的CI/CD持续交付软件生产线&#xff0c;帮助企业快速转型&#xff0c;实现DevOps持续交付高…

FastApi SQLAlchemy SQLite

FastApi fastapi是一个用于构建API 的现代、快速&#xff08;高性能&#xff09;的web框架&#xff0c;它是建立在Starlette和Pydantic基础上的。 Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库&#xff0c;Starlette是一种轻量级的ASGI框架/工具包&…

Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu

一、使用说明 1.1 设备模拟-Com 第一步&#xff0c;填写要模拟的设备地址&#xff0c;0表示自动处理&#xff0c;也就是收到什么地址就应答什么地址。第二步&#xff0c;填写对应的串口号和波特率。第三步&#xff0c;单击打开串口&#xff0c;成功后会变成关闭串口字样。单击…

智慧公厕厂家:智慧公厕建设推动城市公厕智能化变革

随着科技的不断进步&#xff0c;智慧公厕厂家正以创新之力推动着城市公厕的智能化变革。 一、提升用户体验 智慧公厕为使用者带来了前所未有的便利。通过实时显示厕位使用情况&#xff0c;避免了旅客的无效排队&#xff0c;节省了时间。感应式设备如水龙头、洗手液等&#xff…

工业数据采集网关如何与设备进行连接?天拓四方

在工业自动化与智能化日益普及的今天&#xff0c;工业数据采集网关成为了连接各种工业设备与数据中心的桥梁。 一、工业数据采集网关的作用 工业数据采集网关&#xff0c;作为工业自动化系统的核心组成部分&#xff0c;负责实时采集、处理和传输来自各种工业设备的数据。它能…

RS232和RS485

文章目录 RS232和RS485编程与UART一摸一样RS232RS485 前情提要&#xff1a;UART的缺点 电气接口不统一 UART只是对信号的时序进行了定义&#xff0c;而未定义接口的电气特性 电压电平不兼容 UART通信中通常使用处理器的电平&#xff08;如TTL电平&#xff09;&#xff0c;但不…

【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式

上篇文章&#xff1a; 【Vue】Vue3.0 &#xff08;十二&#xff09;、watchEffect 和watch的区别及使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月18日20点56分 文章目录 基本…

主键 外键

主键 外键 在关系型数据库中&#xff0c;主键&#xff08;Primary Key&#xff09;和外键&#xff08;Foreign Key&#xff09;是用于维护数据完整性和建立表之间关系的重要概念。 主键&#xff08;Primary Key&#xff09; 定义: 主键是一个或多个列的组合&#xff0c;其值能…

初始Python篇(4)—— 元组、字典

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 元组 相关概念 元组的创建与删除 元组的遍历 元组生成式 字典 相关概念 字典的创建与删除 字典的遍历与访问 字典…

Maple :一款强大的计算软件,广泛应用于数学、工程、物理和其他科学领域

Maple 是一款强大的计算软件&#xff0c;广泛应用于数学、工程、物理和其他科学领域。它以其符号计算、数值计算和图形可视化能力而闻名&#xff0c;适用于从基础到高级的数学问题。以下是对 Maple 的详细介绍&#xff1a; 1. 基本功能 符号计算 &#xff1a;Maple 能够处理复…

RBAC 模型

系统权限控制最常采用的访问控制模型就是 RBAC 模型 。 什么是 RBAC 呢&#xff1f; RBAC 即基于角色的权限访问控制&#xff08;Role-Based Access Control&#xff09;。这是一种通过角色关联权限&#xff0c;角色同时又关联用户的授权的方式。 简单地说&#xff1a;一个用…

鸿蒙网络编程系列7-TLS安全数据传输单向认证示例

1.TLS简介 TLS&#xff08;Transport Layer Security&#xff09;协议的前身是SSL&#xff08;Secure Socket Layer&#xff09;安全套接层协议&#xff0c;由Netscape公司于1994年提出&#xff0c;是一套网络通信安全协议。IETF&#xff08;The Internet Engineering Task Fo…

ORACLE 19C安装 RAC报错

1. 问题描述 在Oracle 19C RAC的安装过程中&#xff0c;使用克隆方式在两个节点上部署集群。当第一个节点配置好基础服务后&#xff0c;关机并克隆节点。当尝试在第二个节点上通过页面进行RAC安装时&#xff0c;出现以下错误&#xff1a; [INS-32070] Could not remove the n…

Maven--简略

简介 Apache旗下的一款开源项目&#xff0c;用来进行项目构建&#xff0c;帮助开发者管理项目中的jar及jar包之间的依赖&#xff0c;还拥有项目编译、测试、打包的功能。 管理方式 统一建立一个jar仓库&#xff0c;把jar上传至统一的仓库&#xff0c;使用时&#xff0c;配置…

ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南

在地理信息系统&#xff08;GIS&#xff09;的应用中&#xff0c;加载高清影像与街道地图对于地图制图、影像查阅、空间数据分析等工作至关重要。天地图作为官方出品的地图服务&#xff0c;以其标准的数据、较快的影像更新速度等特点受到广泛欢迎。以下是如何在ArcGIS中无插件加…

【论文速读】Prompt Tuning:The Power of Scale for Parameter-Effificient Prompt Tuning

arxiv&#xff1a;2104.08691v2 摘要 在这项工作中&#xff0c;我们探索了“prompt tuning&#xff08;提示调优&#xff09;”&#xff0c;这是一种简单而有效的机制&#xff0c;用于学习“soft prompts&#xff08;软提示&#xff09;”&#xff0c;以条件下冻结的语言模型…

MATLAB智能算法 - AntColonyOptimization蚁群算法

AntColonyOptimization蚁群算法 智能算法是路线规划、深度学习等等一系列领域所使用的优化算法&#xff0c;是算法进阶之路的必备之路。 前言&#xff1a;本文主要围绕解决TSP旅行商问题展开&#xff0c;对于机器人的路线规划以及非线性方程求解的问题等解决方案 对于一些其他优…

leetcode289:生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…