MinIO简介

MinIO 是在 Apache License v2.0 下发布的对象存储服务器。 它与 Amazon S3 云存储服务兼容。 它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM 映像。 对象的大小可以从几 KB 到最大 5TB。

MinIOdocker安装

  • 拉取镜像

    1. docker pull minio/minio
  • 创建并运行容器

    1. docker run -it --name minio -p 9000:9000 -p 9001:9001 -d \
    2. -v /usr/local/docker/minio/data:/data \
    3. -v /usr/local/docker/minio/config:/root/.minio \
    4. -e 'MINIO_ROOT_USER=admin' \
    5. -e 'MINIO_ROOT_PASSWORD=admin123' \
    6. minio/minio server /data --console-address ":9001"

    查看容器日志:

    1. docker logs xx

9000:API调用端口
9001:控制台端口,不指定他会随机生成。注:控制台用9000也能打开,最终会跳转到9001,效果一样的
随后,在浏览器打开9000端口,分别输入上面的账号密码(账号:admin,密码:admin123),登录即可
image.png

创建Bucket

登录成功后,进入MinIO后台页面。
image.png
根据下图操作,创建Bucket,为了测试创建:test01的Bucket(桶)
image.png

springboot集成MinIO

使用maven引用minio依赖

  1. <dependency>
  2. <groupId>io.minio</groupId>
  3. <artifactId>minio</artifactId>
  4. <version>8.3.0</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>com.squareup.okhttp3</groupId>
  8. <artifactId>okhttp</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.squareup.okhttp3</groupId>
  14. <artifactId>okhttp</artifactId>
  15. <version>4.8.1</version>
  16. </dependency>

MinioUtil 创建操作类

建一个 MinioUtil 操作类,并实例化 MinioClient 对象

  1. public class MinioUtil {
  2. private static MinioClient client;
  3. static {
  4. try {
  5. client = MinioClient.builder()
  6. .endpoint(new URL("http://121.5.104.63:9000"))
  7. .credentials("admin", "admin123")
  8. .build();
  9. } catch (MalformedURLException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. }

MinioUtil 实现文件上传

  1. /**
  2. * 上传本地文件
  3. */
  4. public static ObjectWriteResponse upload(String bucket, String localFileName, String remoteFileName) throws Exception{
  5. File file = new File(localFileName);
  6. FileInputStream fileInputStream = new FileInputStream(file);
  7. return client.putObject(PutObjectArgs.builder()
  8. .stream(fileInputStream, file.length(), PutObjectArgs.MIN_MULTIPART_SIZE)
  9. .object(remoteFileName)
  10. .bucket(bucket)
  11. .build());
  12. }
  13. /**
  14. * 上传MultipartFile
  15. */
  16. public static ObjectWriteResponse upload(String bucket, MultipartFile file, String remoteFileName) throws Exception {
  17. return client.putObject(PutObjectArgs.builder()
  18. .bucket(bucket)
  19. .stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE)
  20. .object(remoteFileName)
  21. .build());
  22. }

MinIO实现文件下载

修改 MinioUtil,增加 2 个下载方法,分别是下载到本地和浏览器打开下载

  1. /**
  2. * 下载文件到本地
  3. */
  4. public static void downLocal(String bucket, String remoteFileName, String localFileName) throws Exception {
  5. client.downloadObject(DownloadObjectArgs.builder()
  6. .bucket(bucket)
  7. .object(remoteFileName)
  8. .filename(localFileName)
  9. .build());
  10. }
  11. /**
  12. * 下载文件写入HttpServletResponse
  13. */
  14. public static void downResponse(String bucket, String remoteFileName, HttpServletResponse response) throws Exception {
  15. GetObjectResponse object = client.getObject(GetObjectArgs.builder()
  16. .bucket(bucket)
  17. .object(remoteFileName)
  18. .build());
  19. response.setHeader("Content-Disposition", "attachment;filename=" + remoteFileName.substring(remoteFileName.lastIndexOf("/")+1));
  20. response.setContentType("application/force-download");
  21. response.setCharacterEncoding("UTF-8");
  22. IOUtils.copy(object, response.getOutputStream());
  23. }

创建 MinioController

  1. @RestController
  2. @RequestMapping("/minio")
  3. public class MinioController {
  4. /**
  5. * 上传本地文件
  6. */
  7. @GetMapping("/uploadLocalFile")
  8. public String uploadLocalFile() throws Exception{
  9. ObjectWriteResponse resp = MinioUtil.upload("test01", "E:\\测试文件.txt", getDatePath()+"test.txt");
  10. return "上传成功";
  11. }
  12. /**
  13. * 上传MultipartFile
  14. */
  15. @PostMapping("/uploadMultipartFile")
  16. public String uploadMultipartFile(MultipartFile file) throws Exception {
  17. ObjectWriteResponse resp = MinioUtil.upload("test01", file, getDatePath() + file.getOriginalFilename());
  18. return "上传成功";
  19. }
  20. /**
  21. * 下载文件到本地
  22. */
  23. @PostMapping("/downLocal")
  24. public String downLocal() throws Exception {
  25. MinioUtil.downLocal("test01", "/2022/4/15/test.txt", "test.txt");
  26. return "下载成功";
  27. }
  28. /**
  29. * 下载文件写入HttpServletResponse
  30. */
  31. @GetMapping("/downResponse")
  32. public void downResponse(HttpServletResponse response) throws Exception {
  33. MinioUtil.downResponse("test01", "/2022/4/15/test.txt", response);
  34. }
  35. private String getDatePath(){
  36. LocalDateTime now = LocalDateTime.now();
  37. return String.format("/%s/%s/%s/", now.getYear(), now.getMonthValue(), now.getDayOfMonth());
  38. }
  39. }

执行完毕后,在 test01 这个 bucket 底下,会创建 /2022/04/15/ 的目录,并且将文件上传到该目录下
image.png

设置永久下载地址

前面讲的例子是调用 Minio API 获取文件,从而实现下载功能。此外,minio 也允许通过文件地址直接下载。
打开 Bucket,点击 Manage 进行设置管理
image.png
点击这里的 Private,把它改成 Public
image.png
以这个文件为例,下载地址就是 http://121.5.104.63:9000/test01/2022/4/15/test.txt,直接从浏览器打开就可以测试。