SpringBoot整合Minio

# SpringBoot整合Minio

1. ### 进入<a href="https://min.io/">Minio官网</a>,下载对应的Minio版本

   ![image-20221227142449024](https://img-1303838157.cos.ap-nanjing.myqcloud.com/img/image-20221227142449024.png)

   > <a href="https://min.io/docs/minio/kubernetes/upstream/">官网安装文档</a>

   ![image-20221227143012393](https://img-1303838157.cos.ap-nanjing.myqcloud.com/img/image-20221227143012393.png)

2. ### 下载完成之后,启动(windows版)

   ```bash
   minio.exe server D:\minio\server
   ```

   

   ![image-20221227143105861](https://img-1303838157.cos.ap-nanjing.myqcloud.com/img/image-20221227143105861.png)

   >minio.exe server:启动服务
   >
   >D:\minio\server:设置上传图片存储路径
   >
   >API:上传图片链接(端口默认9000)
   >
   >RootUser:账号
   >
   >RootPass:密码
   >
   >Console:控制台地址

3. ### 访问控制台地址:http://192.168.1.15:50932 进入控制台

   ![image-20221227143720582](https://img-1303838157.cos.ap-nanjing.myqcloud.com/img/image-20221227143720582.png)

4. ### 创建存储桶

   ![image-20221227143845517](https://img-1303838157.cos.ap-nanjing.myqcloud.com/img/image-20221227143845517.png)

5. ### 引入依赖

   ```xml
   <!--minio-->
           <dependency>
               <groupId>io.minio</groupId>
               <artifactId>minio</artifactId>
               <version>8.0.3</version>
           </dependency>
   ```

6. yml配置

   ```yaml
   server:
     port: 8099
   spring:
     # 配置文件上传大小限制
     servlet:
       multipart:
         max-file-size: 200MB
         max-request-size: 200MB
   minio:
   #文件上传接口
     endpoint: http://127.0.0.1:9000
     accessKey: minioadmin
     secretKey: minioadmin
     #存储通名称
     bucketName: img
   
   ```

7. ### 配置类(注册minio客户端)

   ```java
   @Data
   @Component
   public class MinIoClientConfig {
   
       @Value("${minio.endpoint}")
       private String endpoint;
   
       @Value("${minio.accessKey}")
       private String accessKey;
   
       @Value("${minio.secretKey}")
       private String secreKey;
   
       /**
        * 注入minio客户端
        * @return
        */
       @Bean
       public MinioClient minioClient(){
           return MinioClient.builder()
                   .endpoint(endpoint)
                   .credentials(accessKey,secreKey)
                   .build();
       }
   }
   ```

8. ### 工具类

   ```java
   /**
    * 功能描述:MinioUtils
    *
    * @author: sc
    * @Date: 2022/12/27
    * @Time: 10:26
    */
   @Component
   public class MinioUtils {
       @Autowired
       private MinioClient minioClient;
   
       @Value("${minio.bucketName}")
       private String bucketName;
   
       /**
        * description: 判断bucket是否存在,不存在则创建
        *
        * @return: void
        */
       public void existBucket(String name) {
           try {
               boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
               if (!exists) {
                   minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
   
       /**
        * 创建存储bucket
        * @param bucketName 存储bucket名称
        * @return Boolean
        */
       public Boolean makeBucket(String bucketName) {
           try {
               minioClient.makeBucket(MakeBucketArgs.builder()
                       .bucket(bucketName)
                       .build());
           } catch (Exception e) {
               e.printStackTrace();
               return false;
           }
           return true;
       }
   
       /**
        * 删除存储bucket
        * @param bucketName 存储bucket名称
        * @return Boolean
        */
       public Boolean removeBucket(String bucketName) {
           try {
               minioClient.removeBucket(RemoveBucketArgs.builder()
                       .bucket(bucketName)
                       .build());
           } catch (Exception e) {
               e.printStackTrace();
               return false;
           }
           return true;
       }
   
       /**
        * description: 上传文件
        *
        * @param multipartFile
        * @return: java.lang.String
        */
       public List<String> upload(MultipartFile[] multipartFile) {
           List<String> names = new ArrayList<>(multipartFile.length);
           for (MultipartFile file : multipartFile) {
               String fileName = file.getOriginalFilename();
               String[] split = fileName.split("\\.");
               if (split.length > 1) {
                   fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1];
               } else {
                   fileName = fileName + System.currentTimeMillis();
               }
               InputStream in = null;
               try {
                   in = file.getInputStream();
                   minioClient.putObject(PutObjectArgs.builder()
                           .bucket(bucketName)
                           .object(fileName)
                           .stream(in, in.available(), -1)
                           .contentType(file.getContentType())
                           .build()
                   );
               } catch (Exception e) {
                   e.printStackTrace();
               } finally {
                   if (in != null) {
                       try {
                           in.close();
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
               }
               names.add(fileName);
           }
           return names;
       }
   
       /**
        * description: 下载文件
        *
        * @param fileName
        * @return: org.springframework.http.ResponseEntity<byte [ ]>
        */
       public ResponseEntity<byte[]> download(String fileName) {
           ResponseEntity<byte[]> responseEntity = null;
           InputStream in = null;
           ByteArrayOutputStream out = null;
           try {
               in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
               out = new ByteArrayOutputStream();
               IOUtils.copy(in, out);
               //封装返回值
               byte[] bytes = out.toByteArray();
               HttpHeaders headers = new HttpHeaders();
               try {
                   headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
               } catch (UnsupportedEncodingException e) {
                   e.printStackTrace();
               }
               headers.setContentLength(bytes.length);
               headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
               headers.setAccessControlExposeHeaders(Arrays.asList("*"));
               responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
               try {
                   if (in != null) {
                       try {
                           in.close();
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
                   if (out != null) {
                       out.close();
                   }
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
           return responseEntity;
       }
   
       /**
        * 查看文件对象
        * @param bucketName 存储bucket名称
        * @return 存储bucket内文件对象信息
        */
       public List<ObjectItem> listObjects(String bucketName) {
           Iterable<Result<Item>> results = minioClient.listObjects(
                   ListObjectsArgs.builder().bucket(bucketName).build());
           List<ObjectItem> objectItems = new ArrayList<>();
           try {
               for (Result<Item> result : results) {
                   Item item = result.get();
                   ObjectItem objectItem = new ObjectItem();
                   objectItem.setObjectName(item.objectName());
                   objectItem.setSize(item.size());
                   objectItems.add(objectItem);
               }
           } catch (Exception e) {
               e.printStackTrace();
               return null;
           }
           return objectItems;
       }
   
       /**
        * 批量删除文件对象
        * @param bucketName 存储bucket名称
        * @param objects 对象名称集合
        */
       public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {
           List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
           Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
           return results;
       }
   
   }
   ```

   > 实体类

   ```java
   /**
    * 功能描述:
    *
    * @author: sc
    * @Date: 2022/12/27
    * @Time: 10:25
    */
   @Data
   public class ObjectItem {
       private String objectName;
       private Long size;
   }
   
   ```

9. ### 编写Controller

   ```java
   /**
    * 功能描述:
    *
    * @author: sc
    * @Date: 2022/12/27
    * @Time: 10:35
    */
   @RestController
   public class MinioController {
       @Resource
       private MinioUtils minioUtils;
       @Value("${minio.endpoint}")
       private String address;
       @Value("${minio.bucketName}")
       private String bucketName;
   
       /**
        * 文件上传
        * @param files
        * @return
        */
       @PostMapping("/upload")
       public Object upload(MultipartFile[] files){
           List<String> uploadUrl = new ArrayList<>();
           List<String> upload = minioUtils.upload(files);
           for (String s : upload) {
               uploadUrl.add(address+"/"+bucketName+"/"+s);
           }
           return uploadUrl;
       }
   
       /**
        * 移除图片
        * @param imgUrlList
        * @return
        */
       @PostMapping("/remove")
       public Object remove(@RequestBody List<String> imgUrlList){
           Iterable<Result<DeleteError>> img = minioUtils.removeObjects("img", imgUrlList);
           return img;
       }
   
       /**
        * 下载图片
        * @param fileName
        * @return
        */
       @GetMapping("/download/{fileName}")
       public Object download(@PathVariable("fileName") String fileName){
           ResponseEntity<byte[]> download = minioUtils.download(fileName);
           return download;
       }
   }
   ```

   

#### <a href="https://min.io/docs/minio/linux/index.html">Linux安装教程</a>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值