minio 安装

请参考使用 docker compose 部署方式

minio JAVA SKD 构建

JAVA SDK 官方文档

引入依赖,版本不同构建客户端代码不同

  1. implementation 'io.minio:minio:8.2.1'

构建客户端,通过 boot 的 yml 配置文件完成用户名密码等配置

  1. import org.apache.commons.lang3.StringUtils;
  2. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import io.minio.BucketExistsArgs;
  6. import io.minio.MakeBucketArgs;
  7. import io.minio.MinioClient;
  8. import lombok.extern.slf4j.Slf4j;
  9. /**
  10. * @author mrcode
  11. * @date 2021/5/20 14:07
  12. */
  13. @Configuration
  14. @EnableConfigurationProperties({
  15. MinioConfig.class
  16. })
  17. @Slf4j
  18. public class MinioClientConfig {
  19. @Bean
  20. public MinioClient minioClient(MinioConfig minioConfig) {
  21. // 使用 MinIO 服务的 URL,端口,Access key 和 Secret key创建一个 MinioClient 对象
  22. MinioClient minioClient =
  23. MinioClient.builder()
  24. .endpoint(minioConfig.getUrl())
  25. .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
  26. .build();
  27. final String bucket = minioConfig.getBucket();
  28. if (StringUtils.isBlank(bucket)) {
  29. return minioClient;
  30. }
  31. try {
  32. // 检查存储桶是否已经存在
  33. boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
  34. if (isExist) {
  35. log.info("s3 存储桶 {} 已存在", bucket);
  36. } else {
  37. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
  38. log.info("s3 存储桶 {} 已创建", bucket);
  39. }
  40. } catch (Exception e) {
  41. throw new RuntimeException(e);
  42. }
  43. return minioClient;
  44. }
  45. }

配置类

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. import java.util.List;
  3. import lombok.Data;
  4. import lombok.ToString;
  5. /**
  6. * @author mrcode
  7. * @date 2021/5/20 14:16
  8. */
  9. @Data
  10. @ToString
  11. @ConfigurationProperties(prefix = "mrcode.minio")
  12. public class MinioConfig {
  13. /**
  14. * http://localhost:9000/
  15. */
  16. private String url;
  17. /**
  18. * 用户名
  19. */
  20. private String accessKey;
  21. /**
  22. * 密码
  23. */
  24. private String secretKey;
  25. /**
  26. * 使用的桶,用于自动创建桶, 一个项目一个桶
  27. */
  28. private String bucket;
  29. }

测试上传、下载

  1. import org.junit.jupiter.api.Test;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import java.io.IOException;
  5. import java.nio.file.Files;
  6. import java.nio.file.Path;
  7. import java.nio.file.Paths;
  8. import java.security.InvalidKeyException;
  9. import java.security.NoSuchAlgorithmException;
  10. import cn.hutool.core.io.FileUtil;
  11. import io.minio.DownloadObjectArgs;
  12. import io.minio.MinioClient;
  13. import io.minio.PutObjectArgs;
  14. import io.minio.errors.ErrorResponseException;
  15. import io.minio.errors.InsufficientDataException;
  16. import io.minio.errors.InternalException;
  17. import io.minio.errors.InvalidResponseException;
  18. import io.minio.errors.ServerException;
  19. import io.minio.errors.XmlParserException;
  20. /**
  21. * @author mrcode
  22. * @date 2021/5/20 14:53
  23. */
  24. @SpringBootTest
  25. class ConsumerDataControllerTest {
  26. @Autowired
  27. private MinioClient minioClient;
  28. @Test
  29. public void uploadTest() throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
  30. final String first = "D:\\360Downloads\\product.xls";
  31. final Path path = Paths.get(first);
  32. // 上传文件
  33. minioClient.putObject(
  34. PutObjectArgs.builder()
  35. // 存储桶,相当于命名空间
  36. .bucket("test-bucket")
  37. // 上传上去的路径,相对的
  38. .object("img/test.xls")
  39. // 该 API 分未已知文件大小和未知文件大小上传,下面是已知文件大小,未知的可以看该 API 使用方式
  40. .stream(Files.newInputStream(path), Files.size(path), -1)
  41. // contentType 默认是二进制文件类型,可以为 null
  42. .contentType(FileUtil.getMimeType(first))
  43. .build());
  44. // 下载文件
  45. minioClient.downloadObject(DownloadObjectArgs.builder()
  46. // 存储桶
  47. .bucket("test-bucket")
  48. // 在存储桶中的路径
  49. .object("img/test.xls")
  50. // 要下载到本地的文件路径
  51. .filename("D:\\360Downloads\\product-111.xls")
  52. .build());
  53. }
  54. }

删除文件

  1. public boolean delete(String objectPath) {
  2. try {
  3. minioClient.removeObject(RemoveObjectArgs.builder()
  4. .bucket(minioConfig.getBucket())
  5. .object(objectPath)
  6. .build());
  7. return true;
  8. } catch (Exception e) {
  9. log.error(StrUtil.format("文件删除失败,objectPath={}", objectPath), e);
  10. return false;
  11. }
  12. }

客户端 CLI 命令行使用

官方文档

可视化的 WEB 版无法批量下载,可以使用 CLI 这个来做一些更高级的操作。比如 下载整个目录 的文件。

第一步:下载 mc 命令行程序,并验证是否可使用

  1. # 下载之后 https://dl.min.io/client/mc/release/windows-amd64/mc.exe
  2. # 在 mc.exe 所在路径打开 windows 的 cmd.exe 程序,执行下面的代码验证
  3. # 在 linux 下,是 mc
  4. mc.exe --help

第二步:配置一个别名,里面配置的是访问 minio 的链接、账户名、密码信息

  1. # 取别名、 端点 用户名 密码
  2. # 语法:mc alias set <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY>
  3. # 注意:可视化的 web 管理地址并不是端点地址,这个一定要注意
  4. mc alias set minio http://192.168.1.51 BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
  5. # 当你第一次使用 mc 命令时,会初始一些文件
  6. # 上面执行的命令其实就被写入到了 config.json 这个 json 文件中
  7. mc.exe: Configuration written to `C:\Users\xx\mc\config.json`. Please update your access credentials.
  8. mc.exe: Successfully created `C:\Users\xx\mc\share`.
  9. mc.exe: Initialized share uploads `C:\Users\xx\mc\share\uploads.json` file.
  10. mc.exe: Initialized share downloads `C:\Users\xx\mc\share\downloads.json` file.
  11. # 如果校验通过,会有日志出现
  12. Added `minio` successfully.

同时在 config.json 文件中也会出现你的信息

  1. {
  2. "version": "10",
  3. "aliases": {
  4. "minio": {
  5. "url": "http://192.168.1.51",
  6. "accessKey": "BKIKJAA5BMMU2RHO6IBB",
  7. "secretKey": "V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12",
  8. "api": "s3v4",
  9. "path": "auto"
  10. }
  11. }

第三步:使用 ls 命令查看

  1. # 查看根目录,下面的 testdir 就是一个 桶 名称。可以深入进去查看
  2. # 注意:这里的 minio 是上面配置的别名,它代表访问你指定的 minio
  3. mc.exe ls minio
  4. [2021-08-19 18:34:26 CST] 0B testdir\
  5. # 比如查看 a 目录下有哪些东西
  6. mc.exe ls minio/testdir/a
  7. [2021-10-12 15:34:51 CST] 0B p-3\
  8. [2021-10-12 15:34:51 CST] 0B p-4\
  9. [2021-10-12 15:34:51 CST] 0B p-5\
  10. [2021-10-12 15:34:51 CST] 0B p-6\

到这里已经可以正常使用了

下载目录到本地 CP

cp 命令完整文档

  1. # 复制一个目录,需要添加 --recursive 标志 简写为 -r
  2. # 将指定的目录复制到 本地当前目录下,不用手动创建目录 p-3,会自动创建
  3. mc.exe cp minio/testdir/a/p-3 . --recursive
  4. ...3/xxx.jpg: 2.22 MiB / 210.43 MiB [=>