首页 > 其他分享 >使用Minio搭建文件服务器

使用Minio搭建文件服务器

时间:2024-03-17 23:31:23浏览次数:27  
标签:minio new String IOException import 服务器 搭建 public Minio

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)

标签:minio,new,String,IOException,import,服务器,搭建,public,Minio
From: https://blog.csdn.net/littleschemer/article/details/136687773

相关文章

  • 如何不中断连接保持linux服务器持续运行 —— screen 使用介绍
     请参考ck'sblog以获取最佳观感在linux服务器上跑模型的时候,有时会在终端会话中持续了一段时间后超时断开,或者因为意外情况断网,如果正常在命令行终端执行程序时,此时会中断程序的进行,这很恼火,这就意味着要让程序持续运行,就必须得保持主机和服务器的连接,程序跑一晚上,主机就......
  • 3.6 设置服务器来电后自动开机和设置服务定时开机
    3.6设置服务器来电后自动开机3.7设置服务定时开机 ......
  • 手把手教使用静默 搭建Oracle 19c 一主一备ADG集群
    一、环境搭建主机IPora19192.168.134.239ora19std192.168.134.2401.配置yum源1.配置网络yum源1.删除redhat7.0系统自带的yum软件包;rpm-qa|grepyum>oldyum.pkg备份原信息rpm-qa|grepyum|xargsrpm-e--nodeps不检查依赖,直接删除rpm包2.自行下载所需要的软......
  • Python运行环境的搭建(Window11操作系统)
    1.在浏览器搜索、登录http://www.python.org2.点击Downloads进入下载界面 3.点击DownloadPython3.12.0下载2023年最新版 提示:如果我们直接在此界面下载,下载速度会很慢(一秒十几kb),如果有时间可以选择等待半个小时直到下载完成。如果不想等那么久可以使用IDM(收费),或者迅......
  • 【docker】部署minio(分布式文件存储)
    确保Docker已安装:在终端检查Docker是否已安装,运行docker-v命令,如果显示Docker版本信息则说明已安装。拉取MinIO镜像:使用以下命令从DockerHub获取最新版的MinIO官方镜像:dockerpullminio/minio创建本地数据存储目录:在主机上创建一个目录用来存放MinIO的数据持......
  • 数字控制系统Simulink仿真建模(4) (Buck电路闭环控制系统的搭建)
     今天继续和大家分享基于Buck电路的数字控制系统在Simulink仿真环境下的建模。上一个帖子我们已经搭建完采样模型,控制系统中只需要读取这些信号并进行反馈闭环控制,使输出电压跟随参考电压稳定变化即可。 和采样系统一样,在搭建闭环控制模型时也应保证其执行频率为40KHz。需......
  • 【Qt】使用Qt实现Web服务器(一):QtWebApp介绍、演示
    1、简介QtWepApp是使用Qt实现的Web服务器库,虽然名字中有“App”但是它的确是一个lib库,编译生产的是libQtWebAppd.so作者开发QtWepApp是从JavaServlet获得的灵感,本人不懂Java,对本人没有帮助。QtWepApp是一个跨平台的项目,适用于:Linux、Windows、MacOS和QtFramework支......
  • 【Qt】使用Qt实现Web服务器(二):QtWebApp示例源码
    1、最简使用介绍Demo2演示了最简单的用法,输入url后返回“HelloWorld!”;下面详解示例代码,先看主函数1.1主函数#a)QtWebApp库中定义的名字空间stefanfringsusingnamespacestefanfrings;intmain(intargc,char*argv[]){......
  • Docker下搭建ewomail邮件服务器
    EwoMail开源企业邮件系统的docker镜像https://hub.docker.com/r/bestwu/ewomail/注意:mail.ewomail.com换成自己的域名可配置参数https://blog.csdn.net/inthat/article/details/103741662 EwoMail开源企业邮件系统的docker镜像https://hub.docker.com/r/bestwu/ewoma......
  • docker-compose部署Minio
    minio部署以及picGo图床设置docker-compose.yml如下version:"3.7"services:minio:image:"minio/minio"ports:-"9000:9000"-"9001:9001"volumes:-"./minio/data1:/data1"-&qu......