Minio保姆级教程

2023-12-13 04:52:37

转载自:www.javaman.cn

Minio服务器搭建和整合

1、centos安装minio

1.1、创建安装目录

mkdir -p /home/minio

1.2、在线下载minio

#进入目录
cd /home/minio
#下载
wget https://dl.minio.io/server/minio/release/linux-amd64/minio

在这里插入图片描述

1.3、minio配置

1.3.1、添加执行权限
#进入目录
cd /home/minio
#添加执行权限
chmod +x minio
1.3.2、创建minio存储文件夹(该文件夹就是Buckets目录)
mkdir -p /data/minio/book
1.3.3、创建minio配置文件

编写minio配置文件,修改下面代码,wq保存

vim /etc/default/minio

#内容如下
MINIO_ROOT_USER="minioadmin"
MINIO_ROOT_PASSWORD="minioadmin"
MINIO_VOLUMES="/data/minio/book"
MINIO_OPTS="--address 0.0.0.0:9000"
MINIO_OPTS1="--console-address 0.0.0.0:39249"
1.3.4、设置开机启动
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target

[Service]
WorkingDirectory=/usr/local/
User=minio
Group=minio
EnvironmentFile=-/usr/local/etc/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS /data/minio
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
1.3.4、启动
#加载配置
systemctl daemon-reload
#启动minio
systemctl start minio.service
#开启开机自启
systemctl enable minio.service
#查看启动状态
systemctl status minio.service

如下图,代表启动成功

在这里插入图片描述

如果是使用的ecs服务器,需要在安全管理里面把9001和控制台端口(目前使用的是39249,可以在1.3.3步骤配置文件里修改)

1.3.5、登录控制台

浏览器输入地址:http://IP:39249/login,用户名密码为配置文件(MINIO_ROOT_USER="minioadmin"MINIO_ROOT_PASSWORD=“minioadmin”)

在这里插入图片描述

1.3.6、minio配置

1、主界面如下:

在这里插入图片描述

2、点击book,进入buckets的详细信息

在这里插入图片描述

在这里插入图片描述

2、创建access keys访问密钥,主要用于程序连接的时候进行安全控制在这里插入图片描述

2、springboot整合minio

2.1、pom.xml

<!-- minio图片服务器 -->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>${minio.version}</version>
</dependency>

2.2、配置yaml.xml文件

minio:
  endpoint: http://Ip:9000
  accessKey: 2Oo1pE1YHEFTU3eojldN1
  secretKey: 2Z5dJ7EHkd5WOYzK7wxtHPkye2Tc824xWzqPzHd7T
  bucketName: book  ##对应buckets

2.3、编写properties组件,用于读取yaml配置生成bean

package com.ds.core.config.properties;

import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = MinioProperties.PREFIX)
public class MinioProperties
{
    public static final String PREFIX = "minio";
    /**
     * ip:minio地址
     */
    private String endpoint;

    /**
     * 账号
     */
    private String accessKey;

    /**
     * 秘钥
     */
    private String secretKey;
    /**
     * bucketName
     */
    private String bucketName;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
}

2.4、编写MinioService

提供一个简单的方式来与MinIO服务器交互,执行基本的存储桶和文件操作。

package com.ds.blog.system.service;

import com.ds.core.config.properties.MinioProperties;
import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

@Service
public class MinioService {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinioProperties minioProperties;

    
    //创建存储桶: createBucket方法用于创建一个新的存储桶(如果它还不存在)。存储桶是MinIO中用于存储对象的容器。
    public void createBucket(String bucketName) throws Exception{
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }
    
    //上传文件: uploadFile方法允许用户上传一个文件到指定的存储桶。文件名被修改为一个随机的UUID加上原始文件的扩展名,这有助于避免文件名冲突。上传后,返回一个URL,该URL可以用来访问上传的文件
    public String uploadFile(String bucketName, MultipartFile file) throws Exception {
        String filename = UUID.randomUUID().toString()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(bucketName)
                .object(filename)
                .stream(file.getInputStream(), file.getInputStream().available(), -1)
                .contentType(file.getContentType())
                .build());
        return minioProperties.getEndpoint() + "/" + bucketName + "/" + filename;
    }

    //下载文件: downloadFile方法允许用户下载指定存储桶中的文件,并返回该文件的输入流。
    public InputStream downloadFile(String bucketName, String filename) throws Exception {
        return minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName)
                .object(filename)
                .build());
    }
}


2.5、文件上传controller

package com.ds.blog.system.base;

import com.ds.blog.system.service.MinioService;
import com.ds.common.domain.Result;
import com.ds.core.config.properties.MinioProperties;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;

@RestController
public class MinioController {

    @Resource
    private MinioService minioService;

    @Resource
    private MinioProperties minioProperties;

    @PostMapping("/file/upload")
    public Result upload(MultipartFile file) throws Exception {
        String s = minioService.uploadFile(minioProperties.getBucketName(), file);
        return Result.success(s);

    }

}

2.6、前端请求路径

$.ajax({
            url: ctx + '/file/upload',// 上传文件的后端接口
            type: 'POST', // 请求类型为POST
            data: formData, // 使用FormData对象作为数据
            processData: false, // 不对数据进行处理
            contentType: false, // 不设置请求头的Content-Type
            success: function (response) {
                // 上传成功后的处理
                imgSrc = response.message;
                callback(imgSrc)
            },
            error: function (xhr, status, error) {
                // 上传失败时的处理
                console.log('文件上传失败', error);
            }
        });

2.7、最终效果

http://ip:9000后面的book就是我们创建的book桶,数据在控制台也能看到

在这里插入图片描述

在这里插入图片描述

2.8、问题

如果前端图片或者文件无法显示,是因为我们需要将桶的策略(policy)换成public,改完前端就可以正常显示了
在这里插入图片描述

2.9、防盗链

配置CORS(跨域资源共享)

通过配置CORS,你可以限制哪些域可以访问你的MinIO服务器。这可以防止未经授权的第三方网站嵌入你的资源。

示例:

在MinIO的配置文件中,你可以添加CORS配置来限制访问。以下是一个允许来自https://example.com的GET请求的示例:

<CorsConfig>  
    <CorsRule>  
        <AllowedOrigin>https://example.com</AllowedOrigin>  
        <AllowedMethod>GET</AllowedMethod>  
        <AllowedHeader>*</AllowedHeader>  
        <ExposeHeader>*</ExposeHeader>  
    </CorsRule>  
</CorsConfig>

你可以根据需求添加更多的<AllowedOrigin><AllowedMethod>元素来定义不同的规则。

文章来源:https://blog.csdn.net/weixin_44846436/article/details/134870085
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。