minio 安装
minio JAVA SKD 构建
JAVA SDK 官方文档
引入依赖,版本不同构建客户端代码不同
implementation 'io.minio:minio:8.2.1'
构建客户端,通过 boot 的 yml 配置文件完成用户名密码等配置
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
/**
* @author mrcode
* @date 2021/5/20 14:07
*/
@Configuration
@EnableConfigurationProperties({
MinioConfig.class
})
@Slf4j
public class MinioClientConfig {
@Bean
public MinioClient minioClient(MinioConfig minioConfig) {
// 使用 MinIO 服务的 URL,端口,Access key 和 Secret key创建一个 MinioClient 对象
MinioClient minioClient =
MinioClient.builder()
.endpoint(minioConfig.getUrl())
.credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
.build();
final String bucket = minioConfig.getBucket();
if (StringUtils.isBlank(bucket)) {
return minioClient;
}
try {
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
if (isExist) {
log.info("s3 存储桶 {} 已存在", bucket);
} else {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
log.info("s3 存储桶 {} 已创建", bucket);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return minioClient;
}
}
配置类
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
import lombok.Data;
import lombok.ToString;
/**
* @author mrcode
* @date 2021/5/20 14:16
*/
@Data
@ToString
@ConfigurationProperties(prefix = "mrcode.minio")
public class MinioConfig {
/**
* http://localhost:9000/
*/
private String url;
/**
* 用户名
*/
private String accessKey;
/**
* 密码
*/
private String secretKey;
/**
* 使用的桶,用于自动创建桶, 一个项目一个桶
*/
private String bucket;
}
测试上传、下载
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import cn.hutool.core.io.FileUtil;
import io.minio.DownloadObjectArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InsufficientDataException;
import io.minio.errors.InternalException;
import io.minio.errors.InvalidResponseException;
import io.minio.errors.ServerException;
import io.minio.errors.XmlParserException;
/**
* @author mrcode
* @date 2021/5/20 14:53
*/
@SpringBootTest
class ConsumerDataControllerTest {
@Autowired
private MinioClient minioClient;
@Test
public void uploadTest() throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
final String first = "D:\\360Downloads\\product.xls";
final Path path = Paths.get(first);
// 上传文件
minioClient.putObject(
PutObjectArgs.builder()
// 存储桶,相当于命名空间
.bucket("test-bucket")
// 上传上去的路径,相对的
.object("img/test.xls")
// 该 API 分未已知文件大小和未知文件大小上传,下面是已知文件大小,未知的可以看该 API 使用方式
.stream(Files.newInputStream(path), Files.size(path), -1)
// contentType 默认是二进制文件类型,可以为 null
.contentType(FileUtil.getMimeType(first))
.build());
// 下载文件
minioClient.downloadObject(DownloadObjectArgs.builder()
// 存储桶
.bucket("test-bucket")
// 在存储桶中的路径
.object("img/test.xls")
// 要下载到本地的文件路径
.filename("D:\\360Downloads\\product-111.xls")
.build());
}
}
删除文件
public boolean delete(String objectPath) {
try {
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(minioConfig.getBucket())
.object(objectPath)
.build());
return true;
} catch (Exception e) {
log.error(StrUtil.format("文件删除失败,objectPath={}", objectPath), e);
return false;
}
}
客户端 CLI 命令行使用
可视化的 WEB 版无法批量下载,可以使用 CLI 这个来做一些更高级的操作。比如 下载整个目录 的文件。
第一步:下载 mc 命令行程序,并验证是否可使用
# 下载之后 https://dl.min.io/client/mc/release/windows-amd64/mc.exe
# 在 mc.exe 所在路径打开 windows 的 cmd.exe 程序,执行下面的代码验证
# 在 linux 下,是 mc
mc.exe --help
第二步:配置一个别名,里面配置的是访问 minio 的链接、账户名、密码信息
# 取别名、 端点 用户名 密码
# 语法:mc alias set <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY>
# 注意:可视化的 web 管理地址并不是端点地址,这个一定要注意
mc alias set minio http://192.168.1.51 BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
# 当你第一次使用 mc 命令时,会初始一些文件
# 上面执行的命令其实就被写入到了 config.json 这个 json 文件中
mc.exe: Configuration written to `C:\Users\xx\mc\config.json`. Please update your access credentials.
mc.exe: Successfully created `C:\Users\xx\mc\share`.
mc.exe: Initialized share uploads `C:\Users\xx\mc\share\uploads.json` file.
mc.exe: Initialized share downloads `C:\Users\xx\mc\share\downloads.json` file.
# 如果校验通过,会有日志出现
Added `minio` successfully.
同时在 config.json 文件中也会出现你的信息
{
"version": "10",
"aliases": {
"minio": {
"url": "http://192.168.1.51",
"accessKey": "BKIKJAA5BMMU2RHO6IBB",
"secretKey": "V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12",
"api": "s3v4",
"path": "auto"
}
}
第三步:使用 ls 命令查看
# 查看根目录,下面的 testdir 就是一个 桶 名称。可以深入进去查看
# 注意:这里的 minio 是上面配置的别名,它代表访问你指定的 minio
mc.exe ls minio
[2021-08-19 18:34:26 CST] 0B testdir\
# 比如查看 a 目录下有哪些东西
mc.exe ls minio/testdir/a
[2021-10-12 15:34:51 CST] 0B p-3\
[2021-10-12 15:34:51 CST] 0B p-4\
[2021-10-12 15:34:51 CST] 0B p-5\
[2021-10-12 15:34:51 CST] 0B p-6\
下载目录到本地 CP
# 复制一个目录,需要添加 --recursive 标志 简写为 -r
# 将指定的目录复制到 本地当前目录下,不用手动创建目录 p-3,会自动创建
mc.exe cp minio/testdir/a/p-3 . --recursive
...3/xxx.jpg: 2.22 MiB / 210.43 MiB [=>