轉載自: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:9000accessKey: 2Oo1pE1YHEFTU3eojldN1secretKey: 2Z5dJ7EHkd5WOYzK7wxtHPkye2Tc824xWzqPzHd7TbucketName: 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;@Beanpublic 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 {@Autowiredprivate MinioClient minioClient;@Autowiredprivate 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 {@Resourceprivate MinioService minioService;@Resourceprivate 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', // 請求類型為POSTdata: formData, // 使用FormData對象作為數據processData: false, // 不對數據進行處理contentType: false, // 不設置請求頭的Content-Typesuccess: 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>
元素來定義不同的規則。