SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作

SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作

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

第一步,我们导入minio的jar包

  1.     <!–minio–>
  2.         <dependency>
  3.             <groupId>io.minio</groupId>
  4.             <artifactId>minio</artifactId>
  5.             <version>8.2.0</version>
  6.         </dependency>
  7.         <!–minio–>

复制代码

第二步,编写配置类

  1. package com.wangfugui.apprentice.config;
  2. import io.minio.MinioClient;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. public class MinioConfig {
  8.         @Value(“${minio.url}”)
  9.     private String url;
  10.     @Value(“${minio.accessKey}”)
  11.     private String accessKey;
  12.     @Value(“${minio.secretKey}”)
  13.     private String secretKey;
  14.     @Bean
  15.     public MinioClient getMinioClient() {
  16.         return MinioClient.builder().endpoint(url)
  17.                                 .credentials(accessKey, secretKey).build();
  18.     }
  19. }

复制代码

这一步的目的是将MinioClient 给注入到spring的容器中以供我们使用

第三步,编写util类

  1. package com.wangfugui.apprentice.common.util;
  2. import com.wangfugui.apprentice.dao.dto.Fileinfo;
  3. import io.minio.BucketExistsArgs;
  4. import io.minio.CopyObjectArgs;
  5. import io.minio.CopySource;
  6. import io.minio.GetObjectArgs;
  7. import io.minio.GetPresignedObjectUrlArgs;
  8. import io.minio.ListObjectsArgs;
  9. import io.minio.MakeBucketArgs;
  10. import io.minio.MinioClient;
  11. import io.minio.PutObjectArgs;
  12. import io.minio.RemoveBucketArgs;
  13. import io.minio.RemoveObjectArgs;
  14. import io.minio.Result;
  15. import io.minio.StatObjectArgs;
  16. import io.minio.http.Method;
  17. import io.minio.messages.Bucket;
  18. import io.minio.messages.Item;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Component;
  21. import java.io.InputStream;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. @Component
  25. public class MinioUtil {
  26.         @Autowired
  27.     private MinioClient minioClient;
  28.         /**
  29.          * 创建一个桶
  30.          */
  31.         public void createBucket(String bucket) throws Exception {
  32.                 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
  33.                 if (!found) {
  34.                         minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
  35.                 }
  36.         }
  37.         /**
  38.          * 上传一个文件
  39.          */
  40.         public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
  41.                 minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
  42.                                 .stream(stream, -1, 10485760).build());
  43.         }
  44.         /**
  45.          * 列出所有的桶
  46.          */
  47.         public List<String> listBuckets() throws Exception {
  48.                 List<Bucket> list = minioClient.listBuckets();
  49.                 List<String> names = new ArrayList<>();
  50.                 list.forEach(b -> {
  51.                         names.add(b.name());
  52.                 });
  53.                 return names;
  54.         }
  55.         /**
  56.          * 列出一个桶中的所有文件和目录
  57.          */
  58.         public List<Fileinfo> listFiles(String bucket) throws Exception {
  59.                 Iterable<Result<Item>> results = minioClient.listObjects(
  60.                             ListObjectsArgs.builder().bucket(bucket).recursive(true).build());
  61.                         List<Fileinfo> infos = new ArrayList<>();
  62.                                 results.forEach(r->{
  63.                                         Fileinfo info = new Fileinfo();
  64.                                         try {
  65.                                                 Item item = r.get();
  66.                                                 info.setFilename(item.objectName());
  67.                                                 info.setDirectory(item.isDir());
  68.                                                 infos.add(info);
  69.                                         } catch (Exception e) {
  70.                                                 e.printStackTrace();
  71.                                         }
  72.                                 });
  73.                 return infos;
  74.         }
  75.         /**
  76.          * 下载一个文件
  77.          */
  78.         public InputStream download(String bucket, String objectName) throws Exception {
  79.                 InputStream stream = minioClient.getObject(
  80.                               GetObjectArgs.builder().bucket(bucket).object(objectName).build());
  81.                 return stream;
  82.         }
  83.         /**
  84.          * 删除一个桶
  85.          */
  86.         public void deleteBucket(String bucket) throws Exception {
  87.                 minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
  88.         }
  89.         /**
  90.          * 删除一个对象
  91.          */
  92.         public void deleteObject(String bucket, String objectName) throws Exception {
  93.                 minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());
  94.         }
  95.         /**
  96.          * 复制文件
  97.          *
  98.          * @Param: [sourceBucket, sourceObject, targetBucket, targetObject]
  99.          * @return: void
  100.          * @Author: MrFugui
  101.          * @Date: 2021/11/15
  102.          */
  103.         public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) throws Exception {
  104.                 this.createBucket(targetBucket);
  105.                 minioClient.copyObject(CopyObjectArgs.builder().bucket(targetBucket).object(targetObject)
  106.                                 .source(CopySource.builder().bucket(sourceBucket).object(sourceObject).build()).build());
  107.         }
  108.         /**
  109.          * 获取文件信息
  110.          *
  111.          * @Param: [bucket, objectName]
  112.          * @return: java.lang.String
  113.          * @Author: MrFugui
  114.          * @Date: 2021/11/15
  115.          */
  116.         public String getObjectInfo(String bucket, String objectName) throws Exception {
  117.                 return minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(objectName).build()).toString();
  118.         }
  119.         /**
  120.          * 生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。
  121.          *
  122.          * @Param: [bucketName, objectName, expires]
  123.          * @return: java.lang.String
  124.          * @Author: MrFugui
  125.          * @Date: 2021/11/15
  126.          */
  127.         public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
  128.                 GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
  129.                                 .builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();
  130.                 return minioClient.getPresignedObjectUrl(build);
  131.         }
  132.         /**
  133.          * 获取minio中所有的文件
  134.          *
  135.          * @Param: []
  136.          * @return: java.util.List<boot.spring.domain.Fileinfo>
  137.          * @Author: MrFugui
  138.          * @Date: 2021/11/15
  139.          */
  140.         public List<Fileinfo> listAllFile() throws Exception {
  141.                 List<String> list = this.listBuckets();
  142.                 List<Fileinfo> fileinfos = new ArrayList<>();
  143.                 for (String bucketName : list) {
  144.                         fileinfos.addAll(this.listFiles(bucketName));
  145.                 }
  146.                 return fileinfos;
  147.         }
  148. }

复制代码

这里集成了minio sdk中的api 这是minio的api文档

第四步,编写controller类

  1. package com.wangfugui.apprentice.controller;
  2. import com.wangfugui.apprentice.common.util.MinioUtil;
  3. import com.wangfugui.apprentice.common.util.ResponseUtils;
  4. import io.swagger.annotations.Api;
  5. import io.swagger.annotations.ApiOperation;
  6. import org.apache.tomcat.util.http.fileupload.IOUtils;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RequestMethod;
  11. import org.springframework.web.bind.annotation.RequestParam;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import org.springframework.web.multipart.MultipartFile;
  14. import javax.servlet.ServletOutputStream;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.io.InputStream;
  17. import java.net.URLEncoder;
  18. @Api(tags = “文件操作接口”)
  19. @RestController
  20. @RequestMapping(value = “/file”)
  21. public class FileController {
  22.     @Autowired
  23.     MinioUtil minioUtil;
  24.     @ApiOperation(“上传一个文件”)
  25.     @RequestMapping(value = “/uploadfile”, method = RequestMethod.POST)
  26.     public ResponseUtils fileupload(@RequestParam MultipartFile uploadfile, @RequestParam String bucket,
  27.                                     @RequestParam(required = false) String objectName) throws Exception {
  28.         minioUtil.createBucket(bucket);
  29.         if (objectName != null) {
  30.             minioUtil.uploadFile(uploadfile.getInputStream(), bucket, objectName + “/” + uploadfile.getOriginalFilename());
  31.         } else {
  32.             minioUtil.uploadFile(uploadfile.getInputStream(), bucket, uploadfile.getOriginalFilename());
  33.         }
  34.         return ResponseUtils.success();
  35.     }
  36.     @ApiOperation(“列出所有的桶”)
  37.     @RequestMapping(value = “/listBuckets”, method = RequestMethod.GET)
  38.     public ResponseUtils listBuckets() throws Exception {
  39.         return ResponseUtils.success(minioUtil.listBuckets());
  40.     }
  41.     @ApiOperation(“递归列出一个桶中的所有文件和目录”)
  42.     @RequestMapping(value = “/listFiles”, method = RequestMethod.GET)
  43.     public ResponseUtils listFiles(@RequestParam String bucket) throws Exception {
  44.         return ResponseUtils.success(minioUtil.listFiles(bucket));
  45.     }
  46.     @ApiOperation(“下载一个文件”)
  47.     @RequestMapping(value = “/downloadFile”, method = RequestMethod.GET)
  48.     public void downloadFile(@RequestParam String bucket, @RequestParam String objectName,
  49.                              HttpServletResponse response) throws Exception {
  50.         InputStream stream = minioUtil.download(bucket, objectName);
  51.         ServletOutputStream output = response.getOutputStream();
  52.         response.setHeader(“Content-Disposition”, “attachment;filename=” + URLEncoder.encode(objectName.substring(objectName.lastIndexOf(“/”) + 1), “UTF-8”));
  53.         response.setContentType(“application/octet-stream”);
  54.         response.setCharacterEncoding(“UTF-8”);
  55.         IOUtils.copy(stream, output);
  56.     }
  57.     @ApiOperation(“删除一个文件”)
  58.     @RequestMapping(value = “/deleteFile”, method = RequestMethod.GET)
  59.     public ResponseUtils deleteFile(@RequestParam String bucket, @RequestParam String objectName) throws Exception {
  60.         minioUtil.deleteObject(bucket, objectName);
  61.         return ResponseUtils.success();
  62.     }
  63.     @ApiOperation(“删除一个桶”)
  64.     @RequestMapping(value = “/deleteBucket”, method = RequestMethod.GET)
  65.     public ResponseUtils deleteBucket(@RequestParam String bucket) throws Exception {
  66.         minioUtil.deleteBucket(bucket);
  67.         return ResponseUtils.success();
  68.     }
  69.     @ApiOperation(“复制一个文件”)
  70.     @GetMapping(“/copyObject”)
  71.     public ResponseUtils copyObject(@RequestParam String sourceBucket, @RequestParam String sourceObject, @RequestParam String targetBucket, @RequestParam String targetObject) throws Exception {
  72.         minioUtil.copyObject(sourceBucket, sourceObject, targetBucket, targetObject);
  73.         return ResponseUtils.success();
  74.     }
  75.     @GetMapping(“/getObjectInfo”)
  76.     @ApiOperation(“获取文件信息”)
  77.     public ResponseUtils getObjectInfo(@RequestParam String bucket, @RequestParam String objectName) throws Exception {
  78.         return ResponseUtils.success(minioUtil.getObjectInfo(bucket, objectName));
  79.     }
  80.     @GetMapping(“/getPresignedObjectUrl”)
  81.     @ApiOperation(“获取一个连接以供下载”)
  82.     public ResponseUtils getPresignedObjectUrl(@RequestParam String bucket, @RequestParam String objectName, @RequestParam Integer expires) throws Exception {
  83.         return ResponseUtils.success(minioUtil.getPresignedObjectUrl(bucket, objectName, expires));
  84.     }
  85.     @GetMapping(“/listAllFile”)
  86.     @ApiOperation(“获取minio中所有的文件”)
  87.     public ResponseUtils listAllFile() throws Exception {
  88.         return ResponseUtils.success(minioUtil.listAllFile());
  89.     }
  90. }

复制代码

注意这里的ResponseUtils请去附件中下载,在yml中配置minio的地址
第五步,配置yml文件

  1. minio:
  2.   url: http://1localhost:9000  #对象存储服务的URL
  3.   accessKey: root #账户
  4.   secretKey: 123456 #密码

复制代码

第六步,启动项目,访问api

到这里就完成了springboot集成minio实现文件的上传等功能

PS:附件中包含了本例的源码及spring-minio源码

下载说明:
1.本站资源都是白菜价出售,同样的东西,我们不卖几百,也不卖几十,甚至才卖几块钱,一个永久会员能下载全站100%源码了,所以单独购买也好,会员也好均不提供相关技术服务。
2.如果源码下载地址失效请联系站长QQ进行补发。
3.本站所有资源仅用于学习及研究使用,请必须在24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您权益请联系本站删除!
4.本站站内提供的所有可下载资源(软件等等)本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发);但本网站不能保证资源的准确性、安全性和完整性,由于源码具有复制性,一经售出,概不退换。用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug;同时本站用户必须明白,【安安资源网】对提供下载的软件等不拥有任何权利(本站原创和特约原创作者除外),其版权归该资源的合法拥有者所有。
5.请您认真阅读上述内容,购买即以为着您同意上述内容,由于源码具有复制性,一经售出,概不退换。
安安资源网 » SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作