Minio服务器搭建和整合
  MV69bd6votD4 2023年12月08日 13 0

转载自:www.javaman.cn

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

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

如下图,代表启动成功

Minio服务器搭建和整合_spring_02

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

1.3.5、登录控制台

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

Minio服务器搭建和整合_上传_03

1.3.6、minio配置

1、主界面如下:

Minio服务器搭建和整合_上传_04

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

Minio服务器搭建和整合_上传_05

Minio服务器搭建和整合_配置文件_06

2、创建access keys访问密钥,主要用于程序连接的时候进行安全控制

Minio服务器搭建和整合_spring_07

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桶,数据在控制台也能看到

Minio服务器搭建和整合_spring_08

Minio服务器搭建和整合_上传_09

2.8、问题

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

Minio服务器搭建和整合_上传_10

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>元素来定义不同的规则。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

推荐阅读
MV69bd6votD4