当前位置:   article > 正文

Spring Boot配置MinIO(实现文件上传、下载、删除)_minio文件过期文件自动清理

minio文件过期文件自动清理

1 MinIO

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

2 MinIO安装和启动

由于MinIO是一个单独的服务器,需要单独部署,有关MinIO在Windows系统上的使用请查看以下博客。

Windows MinIO使用教程(启动,登录,修改密码)

3 pom.xml(maven依赖文件)

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  6. <dependency>
  7. <groupId>cn.hutool</groupId>
  8. <artifactId>hutool-all</artifactId>
  9. <version>5.5.7</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>io.minio</groupId>
  17. <artifactId>minio</artifactId>
  18. <version>7.0.2</version>
  19. </dependency>

 4 applicatin.properties(配置文件)

  1. # 设置单个文件大小
  2. spring.servlet.multipart.max-file-size= 50MB
  3. #minio文件服务器配置
  4. minio.address=http://localhost:9000
  5. minio.accessKey=admin
  6. minio.secretKey=12345678
  7. minio.bucketName=myfile

5 MinIOService

minio有关的操作(判断存储桶是否存在,创建存储桶,上传文件,下载文件,删除文件)

  1. package com.service;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import io.minio.MinioClient;
  5. import io.minio.PutObjectOptions;
  6. import lombok.Data;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.stereotype.Component;
  9. import org.springframework.web.multipart.MultipartFile;
  10. import javax.servlet.ServletOutputStream;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.io.InputStream;
  13. import java.nio.charset.StandardCharsets;
  14. import java.util.Date;
  15. @Data
  16. @Component
  17. public class MinIOService {
  18. @Value("${minio.address}")
  19. private String address;
  20. @Value("${minio.accessKey}")
  21. private String accessKey;
  22. @Value("${minio.secretKey}")
  23. private String secretKey;
  24. @Value("${minio.bucketName}")
  25. private String bucketName;
  26. public MinioClient getMinioClient() {
  27. try {
  28. return new MinioClient(address, accessKey, secretKey);
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. return null;
  32. }
  33. }
  34. /**
  35. * 检查存储桶是否存在
  36. *
  37. * @param bucketName 存储桶名称
  38. * @return
  39. */
  40. public boolean bucketExists(MinioClient minioClient, String bucketName) {
  41. boolean flag = false;
  42. try {
  43. flag = minioClient.bucketExists(bucketName);
  44. if (flag) {
  45. return true;
  46. }
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. return false;
  50. }
  51. return false;
  52. }
  53. /**
  54. * 创建存储桶
  55. *
  56. * @param bucketName 存储桶名称
  57. */
  58. public boolean makeBucket(MinioClient minioClient, String bucketName) {
  59. try {
  60. boolean flag = bucketExists(minioClient, bucketName);
  61. //存储桶不存在则创建存储桶
  62. if (!flag) {
  63. minioClient.makeBucket(bucketName);
  64. }
  65. return true;
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. return false;
  69. }
  70. }
  71. /**
  72. * 上传文件
  73. *
  74. * @param file 上传文件
  75. * @return 成功则返回文件名,失败返回空
  76. */
  77. public String uploadFile(MinioClient minioClient, MultipartFile file) {
  78. //创建存储桶
  79. boolean createFlag = makeBucket(minioClient, bucketName);
  80. //创建存储桶失败
  81. if (createFlag == false) {
  82. return "";
  83. }
  84. try {
  85. PutObjectOptions putObjectOptions = new PutObjectOptions(file.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
  86. putObjectOptions.setContentType(file.getContentType());
  87. String originalFilename = file.getOriginalFilename();
  88. int pointIndex = originalFilename.lastIndexOf(".");
  89. //得到文件流
  90. InputStream inputStream = file.getInputStream();
  91. //保证文件不重名(并且没有特殊字符)
  92. String fileName = bucketName+ DateUtil.format(new Date(), "_yyyyMMddHHmmss") + (pointIndex > -1 ? originalFilename.substring(pointIndex) : "");
  93. minioClient.putObject(bucketName, fileName, inputStream, putObjectOptions);
  94. return fileName;
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. return "";
  98. }
  99. }
  100. /**
  101. * 下载文件
  102. *
  103. * @param originalName 文件路径
  104. */
  105. public InputStream downloadFile(MinioClient minioClient, String originalName, HttpServletResponse response) {
  106. try {
  107. InputStream file = minioClient.getObject(bucketName, originalName);
  108. String filename = new String(originalName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);
  109. if (StrUtil.isNotBlank(originalName)) {
  110. filename = originalName;
  111. }
  112. response.setHeader("Content-Disposition", "attachment;filename=" + filename);
  113. ServletOutputStream servletOutputStream = response.getOutputStream();
  114. int len;
  115. byte[] buffer = new byte[1024];
  116. while ((len = file.read(buffer)) > 0) {
  117. servletOutputStream.write(buffer, 0, len);
  118. }
  119. servletOutputStream.flush();
  120. file.close();
  121. servletOutputStream.close();
  122. return file;
  123. } catch (Exception e) {
  124. e.printStackTrace();
  125. return null;
  126. }
  127. }
  128. /**
  129. * 删除文件
  130. *
  131. * @param fileName 文件路径
  132. * @return
  133. */
  134. public boolean deleteFile(MinioClient minioClient, String fileName) {
  135. try {
  136. minioClient.removeObject(bucketName, fileName);
  137. } catch (Exception e) {
  138. e.printStackTrace();
  139. return false;
  140. }
  141. return true;
  142. }
  143. /**
  144. * 得到指定文件的InputStream
  145. *
  146. * @param originalName 文件路径
  147. * @return
  148. */
  149. public InputStream getObject(MinioClient minioClient, String originalName) {
  150. try {
  151. return minioClient.getObject(bucketName, originalName);
  152. } catch (Exception e) {
  153. e.printStackTrace();
  154. return null;
  155. }
  156. }
  157. /**
  158. * 根据文件路径得到预览文件绝对地址
  159. *
  160. * @param minioClient
  161. * @param fileName 文件路径
  162. * @return
  163. */
  164. public String getPreviewFileUrl(MinioClient minioClient, String fileName) {
  165. try {
  166. return minioClient.presignedGetObject(bucketName,fileName);
  167. }catch (Exception e){
  168. e.printStackTrace();
  169. return "";
  170. }
  171. }
  172. }

 6 FileController

文件上传、文件下载、文件删除接口。

  1. package com.controller;
  2. import com.service.MinIOService;
  3. import io.minio.MinioClient;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.*;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import javax.servlet.http.HttpServletResponse;
  8. @RequestMapping("/file")
  9. @RestController
  10. public class FileController {
  11. @Autowired
  12. private MinIOService minIOService;
  13. /**
  14. * 上传文件
  15. *
  16. * @param file 文件
  17. * @return
  18. */
  19. @PostMapping("/uploadFile")
  20. public String uploadFile(@RequestBody MultipartFile file) {
  21. MinioClient minioClient = minIOService.getMinioClient();
  22. if (minioClient == null) {
  23. return "连接MinIO服务器失败";
  24. }
  25. return minIOService.uploadFile(minioClient, file);
  26. }
  27. /**
  28. * 下载文件
  29. *
  30. * @param response 返回请求
  31. * @param fileName 文件路径
  32. * @return
  33. */
  34. @GetMapping("/downloadFile")
  35. public String downloadFile(HttpServletResponse response,@RequestParam String fileName) {
  36. MinioClient minioClient = minIOService.getMinioClient();
  37. if (minioClient == null) {
  38. return "连接MinIO服务器失败";
  39. }
  40. return minIOService.downloadFile(minioClient, fileName, response) != null ? "下载成功" : "下载失败";
  41. }
  42. /**
  43. * 删除文件
  44. *
  45. * @param fileName 文件路径
  46. * @return
  47. */
  48. @DeleteMapping("/deleteFile/{fileName}")
  49. public String deleteFile(@PathVariable("fileName") String fileName) {
  50. MinioClient minioClient = minIOService.getMinioClient();
  51. if (minioClient == null) {
  52. return "连接MinIO服务器失败";
  53. }
  54. boolean flag = minIOService.deleteFile(minioClient, fileName);
  55. return flag == true ? "删除成功" : "删除失败";
  56. }
  57. }

7 调试结果

 7.1 文件上传

7.2 文件下载 

7.3 文件删除 

注:

文件删除之后,如果该文件夹下没有文件存在,MinIO会自动删除该空文件夹及上级空文件夹。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/110944
推荐阅读
相关标签
  

闽ICP备14008679号