天气与日历 切换到窄版

 找回密码
 立即注册

QQ登录

只需一步,快速开始

限时开通VIP永久会员,可免费下载所有附件
查看: 18|回复: 0

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

[复制链接]

2693

主题

0

回帖

2833

积分

管理员

积分
2833
发表于 2024-11-4 22:49:19 | 显示全部楼层 |阅读模式
SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作
用springboot集成minio首先介绍一下什么是minio: minio是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。


第一步,我们导入minio的jar包
  •     <!--minio-->
  •         <dependency>
  •             <groupId>io.minio</groupId>
  •             <artifactId>minio</artifactId>
  •             <version>8.2.0</version>
  •         </dependency>
  •         <!--minio-->

[color=rgb(51, 102, 153) !important]复制代码

第二步,编写配置类
  • package com.wangfugui.apprentice.config;
  • import io.minio.MinioClient;
  • import org.springframework.beans.factory.annotation.Value;
  • import org.springframework.context.annotation.Bean;
  • import org.springframework.context.annotation.Configuration;
  • @Configuration
  • public class MinioConfig {
  •         @Value("${minio.url}")
  •     private String url;
  •     @Value("${minio.accessKey}")
  •     private String accessKey;
  •     @Value("${minio.secretKey}")
  •     private String secretKey;
  •     @Bean
  •     public MinioClient getMinioClient() {
  •         return MinioClient.builder().endpoint(url)
  •                                 .credentials(accessKey, secretKey).build();
  •     }
  • }

[color=rgb(51, 102, 153) !important]复制代码

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

第三步,编写util类

  • package com.wangfugui.apprentice.common.util;
  • import com.wangfugui.apprentice.dao.dto.Fileinfo;
  • import io.minio.BucketExistsArgs;
  • import io.minio.CopyObjectArgs;
  • import io.minio.CopySource;
  • import io.minio.GetObjectArgs;
  • import io.minio.GetPresignedObjectUrlArgs;
  • import io.minio.ListObjectsArgs;
  • import io.minio.MakeBucketArgs;
  • import io.minio.MinioClient;
  • import io.minio.PutObjectArgs;
  • import io.minio.RemoveBucketArgs;
  • import io.minio.RemoveObjectArgs;
  • import io.minio.Result;
  • import io.minio.StatObjectArgs;
  • import io.minio.http.Method;
  • import io.minio.messages.Bucket;
  • import io.minio.messages.Item;
  • import org.springframework.beans.factory.annotation.Autowired;
  • import org.springframework.stereotype.Component;
  • import java.io.InputStream;
  • import java.util.ArrayList;
  • import java.util.List;
  • @Component
  • public class MinioUtil {
  •         @Autowired
  •     private MinioClient minioClient;
  •         /**
  •          * 创建一个桶
  •          */
  •         public void createBucket(String bucket) throws Exception {
  •                 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
  •                 if (!found) {
  •                         minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
  •                 }
  •         }
  •         /**
  •          * 上传一个文件
  •          */
  •         public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
  •                 minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
  •                                 .stream(stream, -1, 10485760).build());
  •         }
  •         /**
  •          * 列出所有的桶
  •          */
  •         public List<String> listBuckets() throws Exception {
  •                 List<Bucket> list = minioClient.listBuckets();
  •                 List<String> names = new ArrayList<>();
  •                 list.forEach(b -> {
  •                         names.add(b.name());
  •                 });
  •                 return names;
  •         }
  •         /**
  •          * 列出一个桶中的所有文件和目录
  •          */
  •         public List<Fileinfo> listFiles(String bucket) throws Exception {
  •                 Iterable<Result<Item>> results = minioClient.listObjects(
  •                             ListObjectsArgs.builder().bucket(bucket).recursive(true).build());
  •                         List<Fileinfo> infos = new ArrayList<>();
  •                                 results.forEach(r->{
  •                                         Fileinfo info = new Fileinfo();
  •                                         try {
  •                                                 Item item = r.get();
  •                                                 info.setFilename(item.objectName());
  •                                                 info.setDirectory(item.isDir());
  •                                                 infos.add(info);
  •                                         } catch (Exception e) {
  •                                                 e.printStackTrace();
  •                                         }
  •                                 });
  •                 return infos;
  •         }
  •         /**
  •          * 下载一个文件
  •          */
  •         public InputStream download(String bucket, String objectName) throws Exception {
  •                 InputStream stream = minioClient.getObject(
  •                               GetObjectArgs.builder().bucket(bucket).object(objectName).build());
  •                 return stream;
  •         }
  •         /**
  •          * 删除一个桶
  •          */
  •         public void deleteBucket(String bucket) throws Exception {
  •                 minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
  •         }
  •         /**
  •          * 删除一个对象
  •          */
  •         public void deleteObject(String bucket, String objectName) throws Exception {
  •                 minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());
  •         }
  •         /**
  •          * 复制文件
  •          *
  •          * @Param: [sourceBucket, sourceObject, targetBucket, targetObject]
  •          * @return: void
  •          * @Author: MrFugui
  •          * @Date: 2021/11/15
  •          */
  •         public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) throws Exception {
  •                 this.createBucket(targetBucket);
  •                 minioClient.copyObject(CopyObjectArgs.builder().bucket(targetBucket).object(targetObject)
  •                                 .source(CopySource.builder().bucket(sourceBucket).object(sourceObject).build()).build());
  •         }
  •         /**
  •          * 获取文件信息
  •          *
  •          * @Param: [bucket, objectName]
  •          * @return: java.lang.String
  •          * @Author: MrFugui
  •          * @Date: 2021/11/15
  •          */
  •         public String getObjectInfo(String bucket, String objectName) throws Exception {
  •                 return minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(objectName).build()).toString();
  •         }
  •         /**
  •          * 生成一个给HTTP GET请求用的presigned URL。浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。
  •          *
  •          * @Param: [bucketName, objectName, expires]
  •          * @return: java.lang.String
  •          * @Author: MrFugui
  •          * @Date: 2021/11/15
  •          */
  •         public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
  •                 GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
  •                                 .builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();
  •                 return minioClient.getPresignedObjectUrl(build);
  •         }
  •         /**
  •          * 获取minio中所有的文件
  •          *
  •          * @Param: []
  •          * @return: java.util.List<boot.spring.domain.Fileinfo>
  •          * @Author: MrFugui
  •          * @Date: 2021/11/15
  •          */
  •         public List<Fileinfo> listAllFile() throws Exception {
  •                 List<String> list = this.listBuckets();
  •                 List<Fileinfo> fileinfos = new ArrayList<>();
  •                 for (String bucketName : list) {
  •                         fileinfos.addAll(this.listFiles(bucketName));
  •                 }
  •                 return fileinfos;
  •         }
  • }

[color=rgb(51, 102, 153) !important]复制代码

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

第四步,编写controller类

  • package com.wangfugui.apprentice.controller;
  • import com.wangfugui.apprentice.common.util.MinioUtil;
  • import com.wangfugui.apprentice.common.util.ResponseUtils;
  • import io.swagger.annotations.Api;
  • import io.swagger.annotations.ApiOperation;
  • import org.apache.tomcat.util.http.fileupload.IOUtils;
  • import org.springframework.beans.factory.annotation.Autowired;
  • import org.springframework.web.bind.annotation.GetMapping;
  • import org.springframework.web.bind.annotation.RequestMapping;
  • import org.springframework.web.bind.annotation.RequestMethod;
  • import org.springframework.web.bind.annotation.RequestParam;
  • import org.springframework.web.bind.annotation.RestController;
  • import org.springframework.web.multipart.MultipartFile;
  • import javax.servlet.ServletOutputStream;
  • import javax.servlet.http.HttpServletResponse;
  • import java.io.InputStream;
  • import java.net.URLEncoder;
  • @Api(tags = "文件操作接口")
  • @RestController
  • @RequestMapping(value = "/file")
  • public class FileController {
  •     @Autowired
  •     MinioUtil minioUtil;
  •     @ApiOperation("上传一个文件")
  •     @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
  •     public ResponseUtils fileupload(@RequestParam MultipartFile uploadfile, @RequestParam String bucket,
  •                                     @RequestParam(required = false) String objectName) throws Exception {
  •         minioUtil.createBucket(bucket);
  •         if (objectName != null) {
  •             minioUtil.uploadFile(uploadfile.getInputStream(), bucket, objectName + "/" + uploadfile.getOriginalFilename());
  •         } else {
  •             minioUtil.uploadFile(uploadfile.getInputStream(), bucket, uploadfile.getOriginalFilename());
  •         }
  •         return ResponseUtils.success();
  •     }
  •     @ApiOperation("列出所有的桶")
  •     @RequestMapping(value = "/listBuckets", method = RequestMethod.GET)
  •     public ResponseUtils listBuckets() throws Exception {
  •         return ResponseUtils.success(minioUtil.listBuckets());
  •     }
  •     @ApiOperation("递归列出一个桶中的所有文件和目录")
  •     @RequestMapping(value = "/listFiles", method = RequestMethod.GET)
  •     public ResponseUtils listFiles(@RequestParam String bucket) throws Exception {
  •         return ResponseUtils.success(minioUtil.listFiles(bucket));
  •     }
  •     @ApiOperation("下载一个文件")
  •     @RequestMapping(value = "/downloadFile", method = RequestMethod.GET)
  •     public void downloadFile(@RequestParam String bucket, @RequestParam String objectName,
  •                              HttpServletResponse response) throws Exception {
  •         InputStream stream = minioUtil.download(bucket, objectName);
  •         ServletOutputStream output = response.getOutputStream();
  •         response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8"));
  •         response.setContentType("application/octet-stream");
  •         response.setCharacterEncoding("UTF-8");
  •         IOUtils.copy(stream, output);
  •     }
  •     @ApiOperation("删除一个文件")
  •     @RequestMapping(value = "/deleteFile", method = RequestMethod.GET)
  •     public ResponseUtils deleteFile(@RequestParam String bucket, @RequestParam String objectName) throws Exception {
  •         minioUtil.deleteObject(bucket, objectName);
  •         return ResponseUtils.success();
  •     }
  •     @ApiOperation("删除一个桶")
  •     @RequestMapping(value = "/deleteBucket", method = RequestMethod.GET)
  •     public ResponseUtils deleteBucket(@RequestParam String bucket) throws Exception {
  •         minioUtil.deleteBucket(bucket);
  •         return ResponseUtils.success();
  •     }
  •     @ApiOperation("复制一个文件")
  •     @GetMapping("/copyObject")
  •     public ResponseUtils copyObject(@RequestParam String sourceBucket, @RequestParam String sourceObject, @RequestParam String targetBucket, @RequestParam String targetObject) throws Exception {
  •         minioUtil.copyObject(sourceBucket, sourceObject, targetBucket, targetObject);
  •         return ResponseUtils.success();
  •     }
  •     @GetMapping("/getObjectInfo")
  •     @ApiOperation("获取文件信息")
  •     public ResponseUtils getObjectInfo(@RequestParam String bucket, @RequestParam String objectName) throws Exception {
  •         return ResponseUtils.success(minioUtil.getObjectInfo(bucket, objectName));
  •     }
  •     @GetMapping("/getPresignedObjectUrl")
  •     @ApiOperation("获取一个连接以供下载")
  •     public ResponseUtils getPresignedObjectUrl(@RequestParam String bucket, @RequestParam String objectName, @RequestParam Integer expires) throws Exception {
  •         return ResponseUtils.success(minioUtil.getPresignedObjectUrl(bucket, objectName, expires));
  •     }
  •     @GetMapping("/listAllFile")
  •     @ApiOperation("获取minio中所有的文件")
  •     public ResponseUtils listAllFile() throws Exception {
  •         return ResponseUtils.success(minioUtil.listAllFile());
  •     }
  • }

[color=rgb(51, 102, 153) !important]复制代码

注意这里的ResponseUtils请去附件中下载,在yml中配置minio的地址
第五步,配置yml文件
  • minio:
  •   url: http://1localhost:9000  #对象存储服务的URL
  •   accessKey: root #账户
  •   secretKey: 123456 #密码

[color=rgb(51, 102, 153) !important]复制代码

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

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

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

以下内容需要积分高于 2 才可浏览

链接: https://pan.baidu.com/s/1WpTxsDg1csF7Ctr7_fbqHw



提取码下载:
文件名称:提取码下载.txt 
下载次数:0  文件大小:12 Bytes  售价:39金钱 [记录]
下载权限: 不限 [购买VIP]   [充值]   [在线充值]   【VIP会员5折;永久VIP免费】
安全检测,请放心下载



相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
快速回复 返回顶部 返回列表