目录
[1.1 下载 MinIO 可执行文件](#1.1 下载 MinIO 可执行文件)
[1.2 检查 MinIO 是否安装成功](#1.2 检查 MinIO 是否安装成功)
[1.3 设置数据存储目录](#1.3 设置数据存储目录)
[1.4 配置环境变量(可选)](#1.4 配置环境变量(可选))
[1.5 编写启动的脚本](#1.5 编写启动的脚本)
[1.6 开放端口](#1.6 开放端口)
[1.7 访问](#1.7 访问)
[2.1 引入依赖](#2.1 引入依赖)
[2.2 配置yml文件](#2.2 配置yml文件)
[2.3 编写Minio配置类](#2.3 编写Minio配置类)
[2.4 编写Minio操作类](#2.4 编写Minio操作类)
[2.5 业务类](#2.5 业务类)
[2.6 测试](#2.6 测试)
1、安装MinIO
1.1 下载 MinIO 可执行文件
首先,下载 MinIO 的最新版本。你可以从 MinIO 官网下载或者使用 wget
直接下载。以下是使用 wget
下载并安装的步骤。
bash
# 下载 MinIO 的可执行文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 为 MinIO 可执行文件添加执行权限
chmod +x minio
# 将 MinIO 移动到系统的可执行路径(例如 /usr/local/bin)
sudo mv minio /usr/local/bin/
1.2 检查 MinIO 是否安装成功
通过以下命令验证 MinIO 是否安装成功:
bash
minio --version
如果安装成功,您会看到 MinIO 的版本信息。
1.3 设置数据存储目录
选择一个目录来存储 MinIO 的数据。例如,创建一个 /app/minio/data(这是我的目录,自行修改)
目录用于 MinIO 存储。
bash
sudo mkdir /app/minio/data
1.4 配置环境变量(可选)
可以通过设置环境变量来配置 MinIO 的 MINIO_ROOT_USER
和 MINIO_ROOT_PASSWORD
,这些凭证会用于访问 MinIO Web 控制台和 API。
bash
export MINIO_ROOT_USER="***"
export MINIO_ROOT_PASSWORD="****"
1.5 编写启动的脚本
bash
vim minio.sh
bash
#!/bin/bash
#nohup启动服务 指定文件存放路径/app/minio/data 还有设置日志文件路径/app/minio/minio.log
nohup ./minio server --address :9000 --console-address :9001 /app/minio/data > /app/minio/minio.log 2>&1 &
注意:
1.--address指定了minio的api端口,--console-address指定了minio的可视化管理界面的端口!
2.如果1.4没有执行也可以把1.4的环境变量写在启动的脚本里面 !
3.指定了1.3里面创建的数据存储路径并生成日志文件!
bash
# 赋权
chmod +x minio.sh
# 启动脚本
./minio.sh
#查看日志
cat /app/minio/minio.log
1.6 开放端口
bash
systemctl start firewalld && firewall-cmd --permanent --add-port=9001/tcp && firewall-cmd --reload && firewall-cmd --query-port=9001/tcp
bash
systemctl start firewalld && firewall-cmd --permanent --add-port=9000/tcp && firewall-cmd --reload && firewall-cmd --query-port=9000/tcp
一定要开放9000和9001两个端口!
1.7 访问
http://ip:9001
如果1.3和1.4都没有配置环境变量,那么账号密码都为默认的minioadmin:minioadmin
2、项目实战
2.1 引入依赖
XML
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.4</version>
</dependency>
<!-- minio8.3以上版本需要手动引入okhttp-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
2.2 配置yml文件
java
####################################minio配置#################################
minio:
#此处需注意,需要配置minio的api的端口,配置可视化管理界面的端口会导致接口不报错但是文件操作不了
url: http://ip:9000
access-key: *****
secret-key: *****
bucket-name: ****
2.3 编写Minio配置类
java
package com.example.config;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* <p>
* Minio配置类
* </p>
*
* @custom.date 2025/1/22 14:19
*/
@Data
@Configuration
public class MinioConfig {
/**
* 访问地址
*/
@Value("${minio.url}")
private String endpoint;
/**
* accessKey类似于用户ID,用于唯一标识你的账户
*/
@Value("${minio.access-key}")
private String accessKey;
/**
* secretKey是你账户的密码
*/
@Value("${minio.secret-key}")
private String secretKey;
/**
* 默认存储桶
*/
@Value("${minio.bucket-name}")
private String bucketName;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
2.4 编写Minio操作类
java
package com.example.config;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@Component
@Configuration
public class MinioTemplate {
public MinioTemplate() {}
@Autowired
private MinioConfig minioConfig;
@Autowired
private MinioClient minioClient;
public void createBucket(String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
MinioClient minioClient = this.minioClient;
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(
MakeBucketArgs.builder()
.bucket(bucketName)
.build());
}
}
/**
* 获取文件外链
* @param bucketName bucket 名称
* @param objectName 文件名称
* @return
*/
public String getObjectURL(String bucketName,String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
return this.minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.build());
}
/**
* 获取文件
* @param bucketName
* @param objectName
* @return
*/
public InputStream getObject(String bucketName,String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
return this.minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
/**
* 上传文件
* @param bucketName
* @param objectName
* @param stream
*/
public void putObject(String bucketName, String objectName, InputStream stream) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
//createBucket(bucketName);
this.minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.stream(stream, stream.available(), -1)
.build());
}
/**
* 删除文件
* @param bucketName
* @param objectName
*/
public void removeObject(String bucketName, String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
this.minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build());
}
/**
* 下载文件
* @param bucketName
* @param objectName
*/
public InputStream downloadFile(String bucketName,String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
return this.minioClient.getObject(GetObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build());
}
}
2.5 业务类
java
package com.example.service;
import com.example.config.MinioTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.InputStream;
@Service
public class MinioStorageService {
@Autowired
private MinioTemplate minioTemplate;
@Value("${minio.bucket-name}")
private String bucketName;
/**
* 获取文件外链
*
* @param objectName 文件名称
*/
public String getObjectURL(String objectName) {
try {
return minioTemplate.getObjectURL(bucketName, objectName);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String uploadFile(InputStream inputStream, String filePath) {
String path = null;
try {
minioTemplate.putObject(bucketName, filePath, inputStream);
path = filePath;
} catch (Exception e) {
}
return path;
}
public InputStream downloadFile(String filePath) {
InputStream inputStream = null;
try {
inputStream = minioTemplate.getObject(bucketName, filePath);
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
public void removeFile(String filePath){
try{
minioTemplate.removeObject(bucketName,filePath);
}catch (Exception e){
e.printStackTrace();
}
}
public void createBucket(String bucketName) {
try {
minioTemplate.createBucket(bucketName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.6 测试
java
package com.example.controller;
import com.example.service.MinioStorageService;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@RestController
public class MinioController {
@Autowired
private MinioStorageService minioStorageService;
@RequestMapping("/createBucket")
public void createBucket(@RequestParam("bucketName") String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
minioStorageService.createBucket(bucketName);
}
@RequestMapping("/uploadFile")
public void uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("fileName") String fileName) throws IOException {
minioStorageService.uploadFile(file.getInputStream(),fileName);
}
}
上传成功后可以在控制台中看到这个文件 。