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})@Slf4jpublic class MinioClientConfig {@Beanpublic 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*/@SpringBootTestclass ConsumerDataControllerTest {@Autowiredprivate MinioClient minioClient;@Testpublic 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 下,是 mcmc.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 是上面配置的别名,它代表访问你指定的 miniomc.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 [=>
