使用Minio搭建文件服务器

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

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

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

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

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

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

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

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

注:Minio 完全兼容AWS S3协议。这意味着你可以使用Minio API来访问和操作AWS S3服务;同时,你也可以使用S3API来访问Minio服务器。

1.安装运行Minio

1.1windows安装minio

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

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

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

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

1.2docker安装minio

mkdir mioio && cd minio
mkdir config
mkdir data
docker pull minio/minio
docker run -d  -p 9000:9000 -p 9001:9001 --name minio -v ./data:/data -v ./config:/root/.minio -e "MINIO_ROOT_USER=minio" -e "MINIO_ROOT_PASSWORD=minio123456" minio/minio server /data --console-address ":9001"

1.3运行minio

1.3.1访问Minio的Web界面

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

1.3.2创建存储桶

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

1.3.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文件服务器是一个轻量级的对象存储服务器,可以在本地计算机或云环境中运行。你可以使用MinIO来存储和访问大量的数据。根据不同的操作系统和环境,安装和配置MinIO有几种不同的方法。 对于Windows操作系统,你可以在Windows PowerShell中执行以下命令来安装和配置MinIO: setx MINIO_ROOT_USER admin Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio.exe" setx MINIO_ROOT_PASSWORD password C:\minio.exe server F:\Data --console-address ":9001" 对于Linux操作系统,你可以在命令行中执行以下命令来安装和配置MinIO: wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server ./minio --console-address ":9001" 对于MacOS操作系统,你可以在命令行中执行以下命令来安装和配置MinIO: wget https://dl.min.io/server/minio/release/darwin-amd64/minio chmod +x minio MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server F:\Data --console-address ":9001" 另一种推荐的方法是使用Docker来安装和配置MinIO。你可以使用以下命令来下载并启动MinIO容器: docker-compose up -d 这是一个示例的docker-compose.yml文件的内容: version: '3' services: minio: image: minio/minio hostname: "minio" ports: - "9000:9000" # api 端口 - "9001:9001" # 控制台端口 environment: MINIO_ACCESS_KEY: admin #管理后台用户名 MINIO_SECRET_KEY: password #管理后台密码,最小8个字符 volumes: - /home/deepsoft/minio/data:/data #映射当前目录下的data目录至容器内/data目录 - /home/deepsoft/minio/config:/root/.minio/ #映射配置目录 command: server --console-address ':9001' /data #指定容器中的目录 /data privileged: true restart: always logging: options: max-size: "50M" # 最大文件上传限制 max-file: "10" driver: json-file networks: - minio 这些是安装和配置MinIO文件服务器的不同方法和步骤,你可以根据你的操作系统和环境选择合适的方法来进行安装。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MinIO分布式文件服务器搭建与入门](https://blog.csdn.net/lemon_TT/article/details/124675675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [第03讲:MinIO分布式文件服务器](https://blog.csdn.net/qzc70919700/article/details/129988299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jforgame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值