最近工作中某地项目文件上传方式有了变动,所以MinIO进入了我的视野。
Minio与Amazon S3云存储服务兼容,采用Golang实现,服务端支持Windows、Linux、 OS X和FreeBSD等操作系统;客户端支持Java、Python、Javacript、 Golang语言,下面会有基于java的sdk的相关集成和操作。
Minio是Apache License v2.0下发布的对象存储服务器。它与Amazon S3云存储服务兼容。它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM映像。对象的大小可以从几KB到最大5TB。。。
MinIO中国站点:http://www.minio.org.cn
MinIO中国镜像站:http://dl.minio.org.cn
看了一些资料之后我对这个东西有了一个初步的认知,它与我使用过的阿里云OSS对象存储非常类似,通过endPoint(节点),accessKey(访问密钥),secretKey(密钥),bucketName(桶名,相当于文件夹名称) 这四个部分来实现外部访问和上传文件,不同的是minio需要自己去官网安装并且可以自己设置两种密钥(可以理解为自定义账号密码)。
本地部署MinIO文件服务(Windows)
1.下载并启动
#我是使用Power shell进行下载操作的,也尝试过使用cmd命令行工具下载,但是失败了。
PS> Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "F:\minio\minio.exe"
#设置登录的用户名和密码,对应accessKey和secretKey
PS> setx MINIO_ROOT_USER minioadmin
PS> setx MINIO_ROOT_PASSWORD minioadmin
#启动,address是客户端端口也是程序调用Minio接口要访问的端口,console-address是控制台的端口
PS> F:\minio\minio.exe server F:\minio\Data --address ":9001" --console-address ":9000"
启动成功的页面如下
这是在自己电脑上部署的,所以直接访问127.0.0.1:9000就可以了。
2.创建桶
启动成功后用浏览器访问127.0.0.1:9000会出现如下界面:
然后我们创建一个桶(也就是创建一个文件夹,起名的时候可能会提示桶名不规范,重新取一个名字就行):
到这里minio服务端的相关工作就做完了,接下来就在Java代码中集成minio
3.在Java代码中集成
引入jar包(我的版本是:7.0.2):
然后写一个MinIO的工具类,网上有很多可以自己找来用
package com.jg.gradlesptingdemo.controller;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.testng.annotations.Test;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.List;
import javax.annotation.PostConstruct;
/**
* Minio工具类
* @author JG
*/
@Slf4j
@Component
public class MinIoUtil {
public static MinioClient minioClient;
public static String endPoint = "http://127.0.0.1:9000";
public static String accessKey = "minioadmin";
public static String secretKey = "minioadmin";
public static String bucketName = "yeye";
/**
* 初始化minio配置
*
* @param :
* @return: void
* @date : 2020/8/16 20:56
*/
static{
try {
log.info("Minio Initialize........................");
/*MinioServer minio = new MinioServer();
minioClient = MinioClient.builder().endpoint(minio.getUrl())
.credentials(minio.getAccessKey(),minio.getSecretKey()).build();
createBucket(minio.getBucketName());*/
minioClient = new MinioClient(endPoint, accessKey, secretKey);
createBucket(bucketName);
log.info("Minio Initialize........................successful");
} catch (Exception e) {
e.printStackTrace();
log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());
}
}
/**
* 判断 bucket是否存在
*
* @param bucketName:
* 桶名
* @return: boolean
*/
@SneakyThrows(Exception.class)
public static boolean bucketExists(String bucketName) {
return minioClient.bucketExists(bucketName);
}
/**
* 创建 bucket
*
* @param bucketName:
* 桶名
* @return: void
*/
@SneakyThrows(Exception.class)
public static void createBucket(String bucketName) {
boolean isExist = minioClient.bucketExists(bucketName);
if (!isExist) {
minioClient.makeBucket(bucketName);
}
}
/**
* 获取全部bucket
*
* @param :
* @return: java.util.List<io.minio.messages.Bucket>
*/
@SneakyThrows(Exception.class)
public static List<Bucket> getAllBuckets() {
return minioClient.listBuckets();
}
/**
* 文件上传
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @param filePath:
* 文件路径
* @return: void
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, String fileName, String filePath) {
minioClient.putObject(bucketName, fileName, filePath, null);
return getFileUrl(bucketName, fileName);
}
@Test
public void uploadFileTest() {
String fileName = "1.jpg";
String path = "C:\\Users\\22727\\Desktop\\2.8\\1.jpg";
String url = MinIoUtil.upload(bucketName, fileName, path);
System.out.println(url);
}
@Test
public void getFileUrlTest() {
String fileName = "1.jpg";
String url = MinIoUtil.getFileUrl(bucketName, fileName);
System.out.println(url);
}
/**
* 文件上传
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @param stream:
* 文件流
* @return: java.lang.String : 文件url地址
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, String fileName, InputStream stream) {
minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
return getFileUrl(bucketName, fileName);
}
/**
* 文件上传
*
* @param bucketName:
* 桶名
* @param file:
* 文件
* @return: java.lang.String : 文件url地址
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, MultipartFile file) {
final InputStream is = file.getInputStream();
final String fileName = file.getOriginalFilename();
minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
is.close();
return getFileUrl(bucketName, fileName);
}
/**
* 删除文件
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @return: void
*/
@SneakyThrows(Exception.class)
public static void deleteFile(String bucketName, String fileName) {
minioClient.removeObject(bucketName, fileName);
}
/**
* 下载文件
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @param response:
* @return: void
*/
/* @SneakyThrows(Exception.class)
public static void download(String bucketName, String fileName, HttpServletResponse response) {
// 获取对象的元数据
final ObjectStat stat = minioClient.statObject(bucketName, fileName);
response.setContentType(stat.contentType());
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
InputStream is = minioClient.getObject(bucketName, fileName);
IOUtils.copy(is, response.getOutputStream());
is.close();
}*/
/**
* 获取minio文件的下载地址
*
* @param bucketName:
* 桶名
* @param fileName:
* 文件名
* @return: java.lang.String
* @date : 2020/8/16 22:07
*/
@SneakyThrows(Exception.class)
public static String getFileUrl(String bucketName, String fileName) {
return minioClient.presignedGetObject(bucketName, fileName);
}
}
处理好对应的依赖关系后运行两个测试方法,控制台输出以下内容就说明我们的minio配置成功,可以正常使用了
阿里云部署MinIO服务(Linux)
在阿里云服务器上部署MinIO服务与在Windows上部署步骤差不多,不同的是要云服务器要注意开放对应端口的防火墙。
1.下载并安装
访问MinIO国内镜像地址:https://dl.min.io/server/minio/release/linux-amd64/ ,一般下图的位置是最新的安装包,我们就下载这一个
执行命令:
#进入安装包存放的位置
cd /home/MinIO/
#下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio-20220704210254.0.0.x86_64.rpm
下载完成后直接安装:
rpm -ivh minio-20220704210254.0.0.x86_64.rpm
安装成功后使用命令查看minio服务状态:
systemctl status minio
2.修改配置文件
出现类似这样的情况就说明安装成功了,只是这个时候先不要启动,需要修改 /etc/systemd/system/minio.service 文件,然后修改MinIO的用户名和group(可以修改为 root root)
在(/etc/default/minio)配置文件中可以修改访问的账号和密码,也可以将该地址改为/etc/default/minio.conf,如果该目录下没有这个配置文件就自行创建。
#创建对应的配置文件
touch /etc/default/minio.conf
#编辑
vi /etc/default/minio.conf
加入如下配置内容并保存:
#上传文件的存放位置
MINIO_VOLUMES="/home/minio/data"
#address:客户端端口,也是接口调用端口
#console-address控制台访问端口
MINIO_OPTS="--address :9001 --console-address :9000"
#账号
MINIO_ACCESS_KEY=minioadmin
#密码
MINIO_SECRET_KEY=minioadmin123
3.启动
重新刷新,启动,查看状态:
#刷新
systemctl daemon-reload
#启动
systemctl start minio
#查看状态
systemctl status minio
启动成功:
启动完成后还需要查看对应端口防火墙是否开放:
#查看当前端口是否打开:yes为打开
firewall-cmd --query-port=9000/tcp
#开启防火墙的9000端口
firewall-cmd --zone=public --add-port=9000/tcp --permanent
#查看防火墙的端口哪些是打开的
firewall-cmd --list-port
我是阿里云的服务器,所以我还要开启云服务器外部访问的防火墙规则,直接进入服务器的控制台开启就行:
4.代码中集成
接下来修改代码,把MinIO工具类中对应的配置参数改成服务器的就行,工具类的代码在上一节:本地部署MinIO文件服务(Windows)中