本文介绍windows和linux安装minio,以及minio的基本使用。
一、Minio是什么
Minio是一个优秀的对象存储解决方案,是一个高性能,轻量级的对象存储服务器。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
Minio是用Golang语言开发的,其安装简单,也易理解。
二、windows安装Minio
Minio有两个端,分别为服务端和客户端,服务端即Minio服务,客户端是可视化界面,方便用户操作理解。
2.1、首先在本地创建三个文件夹
2.2、 去官网下载
将下载好的文件放在bin文件夹中
2.3、运行minio
创建一个minion.bat文件,粘贴以下代码
@echo off
REM 声明采用UTF-8编码
chcp 65001
echo.
echo [信息] 运行MinIO文服务器。
echo.
:: 设置窗口标题
title Minio文件服务
:: 设置用户名为minio
setx MINIO_ROOT_USER "minio"
:: 设置密码为minioadmin
setx MINIO_ROOT_PASSWORD "minioadmin"
cd %~dp0
:: 切换到minio.exe文件所在目录
cd D:\app\minio\bin
:: 启动minio服务
minio.exe server D:\app\minio\data --console-address ":9002" --address ":9000" >D:\app\minio\logs\minio.log
pause
注意:用户名最少为4位,密码最少为8位。
其中启动命令为最后一行,9002是客户端端口,9000是服务端端口,可自定义。
保存之后,双击启动minio.bat
成功启动页面
最后http://localhost:9002/browser/进入客户端,用刚刚设置的用户名和密码登陆即可。
三、Linux安装minio
3.1、创建minio文件夹
mkdir minio
在新建的文件夹中创建data文件夹(用于存储文件数据),和minio.log文件(用于记录日志)
cd minio/
mkdir data
touch minio.log
3.2、下载minio
#下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio
3.3、修改用户名和密码
#密码修改
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minioadmin
3.4、 启动
#启动,控制台打印日志
./minio server /minio/data --address ":9000" --console-address ":9001"
#后台启动,打印日志到文件
nohup ./minio server --address ":9000" --console-address ":9001" /minio/data > /minio/minio.log 2>&1 &
如果访问不了,注意查看防火墙是否关闭
四、Java上传和下载文件
4.1、导入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
4.2、配置yml文件
minio:
url: http://localhost:9000
userName: minio
password: minioadmin
4.3、创建实体类
@Configuration
@ConfigurationProperties("minio")
@Data
public class MinioDomain {
private String url;
private String userName;
private String password;
}
需和yml文件一致
4.4、创建配置文件
@Configuration
public class MinioConfig {
private MinioDomain minioDomain;
@Autowired
public void setMinioDomain(MinioDomain minioDomain){
this.minioDomain = minioDomain;
}
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(minioDomain.getUrl())
.credentials(minioDomain.getUserName(), minioDomain.getPassword())
.build();
}
}
4.5、文件上传
public String upload(MultipartFile file) {
String url;
try {
//判断桶是否存在,不存在就新建
boolean test = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());
if (!test) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());
}
//获取当前年月日,创建文件夹
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String[] split = date.split("-");
String uuid = UUID.randomUUID().toString();
//加一个/表示创建文件夹
//添加uuid,防止同名文件夹覆盖
String fileName = split[0] + "/" + split[1] + "/" + split[2] + "/" + uuid + file.getOriginalFilename();
//上传文件
InputStream inputStream = file.getInputStream();
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.contentType(file.getContentType())
.stream(inputStream, inputStream.available(), -1)
.build();
minioClient.putObject(putObjectArgs);
//获取url
GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
.bucket(bucketName)
.object(objectName)
.method(Method.GET)
.build();
String fileUrl=minioClient.getPresignedObjectUrl(args);
url = fileUrl.substring(0,fileUrl.indexOf('?'));//截取问号之前的地址可以永久访问
} catch (Exception e) {
throw new RuntimeException(e);
}
return url;
}
可以通过url来查看文件是否上传成功,也可以在客户端查看。
4.6、文件下载
public void download(HttpServletRequest request, HttpServletResponse response,String url ) throws UnsupportedEncodingException {
String objectUrl = url.split("test"+"/")[1];
//将传递的url 进行切割,获取到相对于桶的文件名
String fileUrl = StringUtils.substringBeforeLast(url, ".");
String fileName = URLEncoder.encode(StringUtils.substringAfterLast(fileUrl, "/"),"UTF-8");
//获取后缀名
String s = StringUtils.substringAfterLast(url, ".");
// 设置响应的内容类型为文件类型
response.setContentType("application/octet-stream");
// 设置响应头,指定文件名
response.setHeader("Content-Disposition", "attachment; filename="+fileName+"."+s);
// 缓冲区大小
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = null;
ServletOutputStream outputStream = null;
try{
//获取文件流
GetObjectArgs getObjectArgs = GetObjectArgs.builder()
.bucket("test")
.object(objectUrl)
.build();
inputStream = minioClient.getObject(getObjectArgs);
// 获取输出流
outputStream = response.getOutputStream();
// 将输入流中的数据写入输出流
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
如果通过返回的url无法访问上传的文件,报错为403,只需将当前桶的权限改为public即可正常访问。