使用Minio搭建文件服务器

news2024/9/22 10:24:12

Minio是一个开源的对象存储服务器,可以用来存储和管理大规模的数据。我们可以用它来存储图片或者视频资源。

minio和阿里云(腾讯云、百度云等)oss对比

  1. 托管方式:MinIO 是一个开源的对象存储系统,可以在自己的服务器或云环境中进行部署和管理。而阿里云 OSS 是由阿里云提供的托管服务,不需要自己购买服务器或进行部署。

  2. 成本:MinIO 是一个开源项目,可以免费使用,您只需要支付服务器和网络等基础设施的费用。而阿里云 OSS 是一个收费的云服务,费用根据存储容量、数据传输和访问次数等因素而定。

  3. 功能和性能:阿里云 OSS 是一个经过大规模使用和测试的云存储服务,提供了丰富的功能和高可用性。MinIO 也提供了类似的功能,并专注于提供高性能和低延迟的对象存储服务。

  4. 数据保护和备份:阿里云 OSS 提供了多层次的数据冗余和备份机制,以确保数据的安全性和可用性。MinIO 也提供了类似的数据冗余和备份机制,但需要用户自行配置和管理。

  5. 地理位置和可用区:阿里云 OSS 在全球范围内提供了多个地理位置和可用区来存储数据,以满足用户的需求。MinIO 则需要用户自行设置多个节点并进行数据的分布式存储。

总结:如果想要免费但折腾的话,可以考虑minio;如果不介意收费的话,肯定选择专业且服务周到的云服务。(当然,minio也提供商业技术服务)

1.安装运行Minio

1.1安装minio

从官网下载Minio的二进制文件,点击前往--》 https://min.io

或者中文版--》https://www.minio.org.cn/

笔者使用的是windows版本,下载之后,新建一个文件夹,用于存储文件(例如叫database)。新建一个批处理脚本start.bat。点击启动服务器。

minio.exe server E:\minio\database\
pause

1.2运行minio

1.2.1访问Minio的Web界面

打开浏览器,输入Minio服务器的地址和端口(默认为http://localhost:9000),账户密码默认是minioadmin。

1.2.2创建存储桶

在Minio的Web界面上,找到"Bucket"按钮,输入存储桶的名称,并选择存储桶的区域和访问权限等。

1.2.3创建accesskey

2.使用springboot操作minio

官方为部分语言提供了操作的sdk,下面以java作为演示

只需导入官方提供的依赖即可

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

2.1springboot封装API工具

官网对API提供了非常详细的例子,传送门 --> minio Java API

2.1.1使用@ConfigurationProperties配置minio

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;

    private String bucket;
}

2.1.2创建MinioClient对象

使用MinioProperties属性值创建MinioClient对象

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

@Configuration
public class MinioConfigs {

    @Autowired
    private MinioProperties properties;

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

}

 2.1.3封装操作bucket和上传/下载文件API

对原生MinioClient对象的操作进行封装,所有名字叫Proxy,简化API。

import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;

@Component
public class MinIoClientProxy {


    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioProperties minioProperties;

    public void createBucket(String name) throws IOException {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

    public void removeBucket(String name) throws IOException {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder().bucket(name).build());
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

    public boolean containsBucket(String name) throws IOException {
        try {
            return minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

    public String upload(InputStream input, String fileName) throws IOException {
        String saveName = fileName;  //TODO 这里需要对文件名进行转换,避免明文存储
        try {
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(minioProperties.getBucket())
                            .object(saveName).stream(input, input.available(), -1)
                            .build());
            return getFileUrl(fileName);
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

    public String getFileUrl(String filePath) {
        return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + filePath;
    }


    public InputStream InputStream(String fileName) throws IOException {
        GetObjectArgs request = GetObjectArgs.builder().bucket(minioProperties.getBucket()).object(fileName).build();
        try {
            return minioClient.getObject(request);
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

    public void remove(String objectName) throws IOException {
        RemoveObjectArgs request = RemoveObjectArgs.builder().bucket(minioProperties.getBucket()).object(objectName).build();
        try {
            minioClient.removeObject(request);
        } catch (Exception e) {
            throw new IOException(e);
        }

    }

}

对bucket的相关操作,已经在minio管理后台处理了,这里就不做演示了。这里重点演示下文件上传功能。

2.1.4使用测试代码上传文件

public class AdminStartup {

    public static void main(String[] args) throws Exception {
        SpringApplication app = new SpringApplication(AdminStartup.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);

        MinIoClientProxy minioClient = SpringContext.getBean(MinIoClientProxy.class);
        InputStream is = new FileInputStream(new File("E:/testfile.jar"));
        String url = minioClient.upload(is, "testfile.jar");
        System.out.println("file url is " + url);
    }
}

 在管理后台可以看到新上传的文件

使用浏览器访问文件,发现访问被拒绝

2.1.5文件下载可读url

默认情况,minio提供的getPresignedObjectUrl()只提供一个有期限(默认七天)的下载url。若要永久url,有几种方法。

1.把过期时间设置得非常长,近似永久;

2.设置桶的访问正常为Public,允许任何人读写

3.为其他人设置只读权限(对外永久可读权限在业务允许范围,例如常见博客文章里的图片url)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录Mysql主从复制-读写分离原理

在实际生产环境中&#xff0c;一台MySQL服务器同时对数据库读写&#xff0c;往往满足不了高并发的需求&#xff0c;因此我们可以使用主从复制的方式来实现数据同步&#xff0c;再通过读写分离的手段提高MySQL并发负载能力。 MySQL主从复制原理 如图&#xff1a; &#xff08;1…

C语言例3-18:使用关系表达式的例子

关系表达式的一般形式&#xff1a; 表达式 关系运算符 表达式 最初代码如下&#xff1a; #include<stdio.h> int main(void) {int i3,j4,k5;float f11.0, f22.1;char c1a, c2d; //a(97) d(100)printf("i>j 的结果为&#xff1a…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统&#xff1a;病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今&#xff0c;大数据、云计算、移动…

中霖教育:考注册会计师报班能提高通过率吗?

CPA考试涵盖了会计、审计、税法及相关的知识,这些知识点不仅繁多而且专业性强&#xff0c;对于自学能力较弱或时间不足的考生来说&#xff0c;有一定的挑战性。在这种情况下&#xff0c;报班提供了系统化和结构化的学习方案&#xff0c;有助于考生更快地掌握考点和难点。 经验…

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测 目录 分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM分类&#xff0…

位运算#蓝桥杯

位运算#蓝桥杯 文章目录 位运算#蓝桥杯1、小蓝学位运算2、异或森林3、位移4、笨笨的机器人5、博弈论 1、小蓝学位运算 #include<bits/stdc.h> using namespace std; using LL long long; const LL N 1e97; template<int kcz> struct ModInt { #define T (*this)…

1997-2022年各省市场化指数及分项指数(初始数据+计算代码+结果)

1997-2022年各省市场化指数及分项指数&#xff08;初始数据计算代码结果&#xff09; 1、时间&#xff1a;1997-2022年 2、来源&#xff1a;2019年之前的数据来源于市场化指数报告&#xff0c;其中2020年之后的数据根据历年数据拓展所得 3、指标&#xff1a;province、year、…

【办公类-40-01】20240311 用Python将MP4转MP3提取音频 (家长会系列一)

作品展示&#xff1a; 背景需求&#xff1a; 马上就要家长会&#xff0c;我负责做会议前的照片滚动PPT&#xff0c;除了大量照片视频&#xff0c;还需要一个时间很长的背景音乐MP3 一、下载“歌曲串烧” 装一个IDM 下载三个“串烧音乐MP4”。 代码展示 家长会背景音乐: 歌曲串…

Windows 安装 Ubuntu 子系统

大约是22年的时候&#xff0c;开始玩这个windows的子系统&#xff0c;当时安装比较顺利。最近也是想看看linux&#xff0c;就在新电脑上装了个ubuntu&#xff0c;记录安装过程。 1.Microsoft Store 搜索 ubuntu&#xff0c;先看评价&#xff1a;很多报错&#xff0c;先不要慌 2…

C语言——动态内存分配

前言&#xff1a;通过前面的学习&#xff0c;我们知道C语言中在内存中开辟空间的方法有&#xff1a;变量和数组。既然拥有了开辟空间的方法&#xff0c;我们为什么还要学习动态内存分配呢&#xff1f; int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…

AI探索实践16 - Typescript开发AI应用8:为大模型增加记忆(Memory)

大家好&#xff0c;我是feng&#xff0c;欢迎关注公众号和我一起探索。如果文章对你有所启发&#xff0c;请为我点赞、转发以及在下方留言自己的理解&#xff01; 每次发文章都看到不少人收藏。我自己也有这个习惯&#xff0c;但是基本上收藏起来的东西都没再打开过。哪怕再遇到…

Vite为什么比Webpack快

一、引言 主流的前端构建工具包括以下几种&#xff1a; Webpack&#xff1a;当下最热门的前端资源模块化管理和打包工具。它能够将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。同时&#xff0c;Webpack还支持代码分割&#xff0c;可以按需加载模块&#…

普林斯顿算法讲义(四)

原文&#xff1a;普林斯顿大学算法课程 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 6.1 事件驱动模拟 原文&#xff1a;algs4.cs.princeton.edu/61event 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 本章节正在建设中。 根据弹性碰撞的法则使用事件驱动…

STM32使用常见错误合集(正在更新版)

本文章记录一些学习STM32的一些错误问题 一、编译、烧录类问题 1、烧录不成功&#xff0c;Keil提示RDDI-DAP Error【场景&#xff1a;PWM驱动直流电机】 解决方案&#xff1a;将电机断开再进行烧录&#xff0c;断开后就可以美美烧录不报错啦~ 二、Keil使用问题 1、打开一个…

中宣部防沉迷系统PHP版本(管局防沉迷验证-PHP-全版本-接口测试样例)

现在对接游戏&#xff0c;无论是登录还是支付都是要去对接防沉迷实名认证接口&#xff0c;但前期的话你要登录网络游戏防沉迷实名认证系统进行接口测试&#xff0c;$appid &#xff0c;$bizId&#xff0c;$key去接口测试页面找&#xff08;正式上线在密钥管理&#xff09;&…

2024.3.14

1、成员函数版本实现算术运算符的重载 全局函数版本实现算术运算符的重载 #include <iostream>using namespace std;class Team {friend const Team operator-(const Team &t1, const Team &t2); private:int a;int b; public:Team(){}Team(int a, int b):a(a…

建筑安全监测系统解决方案-GNSS位移监测站

方案背景 房屋建筑安全是人们生产、经营、居住、学习、娱乐等经济生活和人身安全的基本保证。近年来&#xff0c;房屋安全事故频发&#xff0c;造成了人员伤亡和极大财产损失。因此&#xff0c;在保护居民的人身安全和财产安全方面&#xff0c;房屋建筑安全管理就显得尤为重要…

python--字符串切片和常用的写法

python--字符串切片和常用的写法 正序切片格式注意点 倒序切片格式 字符串运算字符串转义字符串常用方法大小写相关的统计相关的拆分&替换字符串连接&#xff08;面试&#xff09;字符串格式化 正序切片 格式 str1[起始索引:结束索引]左闭右开&#xff08;取左边下标的值&…

python 调用redis创建查询key

部署redis apiVersion: apps/v1 # 描述api版本&#xff0c;默认都用这个 kind: Deployment # 资源类型&#xff0c;可以配置为pod&#xff0c;deployment&#xff0c;service&#xff0c;statefulset等等 metadata: # deployment相关的元数据&#xff0c;用于描述deployment的…

2024哥本哈根major跟以往有什么区别?

2024哥本哈根major跟以往有什么区别&#xff1f; 时隔将近300天&#xff0c;CS2的第一场major终于即将到来。在预选赛中&#xff0c;来自世界各地成千上万支队伍经历过一层又一层的厮杀搏斗&#xff0c;最终遴选出这24支最顶尖的战队&#xff0c;将于3月17日齐聚于哥本哈根的皇…