Java中如何实现minio文件上传
创始人
2024-11-05 06:37:51
0

前面已经在docker中部署了minio服务,那么该如何在Java代码中使用?

这篇说下minio在Java中的配置跟使用。

Docker部署Minio(详细步骤)

文章目录

    • 一、导入minio依赖
    • 二、添加配置
      • application.yml
      • MinIOConfig
      • MinIOConfigProperties
    • 三、导入工具类
      • Service
      • ServiceImpl
    • 四、使用工具类上传文件并返回url
    • 注意事项(问题解决):
      • 1、桶的权限问题
      • 2、url路径问题

一、导入minio依赖

这里还要导入lombok是因为在MinIOConfig类中使用了@Data注解,正常来说导入minio依赖就够了

       io.minio       minio       7.1.0            org.projectlombok       lombok       1.18.20       provided     

二、添加配置

application.yml

这些配置都是在创建minio的docker容器的时候就已经定好的,按照自己的配置去改一改就可以了。需要自定义的就一个桶名称bucket

 minio:     # MinIO服务器地址     endpoint: http://192.168.200.128:9000     # MinIO服务器访问凭据     accessKey: minio     secretKey: minio123     # MinIO桶名称     bucket: test     # MinIO读取路径前缀     readPath: http://192.168.200.128:9000  

MinIOConfig

通过读取配置创建minioClient对象

package com.ruoyi.minio.config;         import com.ruoyi.minio.service.FileStorageService;   import io.minio.MinioClient;   import lombok.Data;   import org.springframework.beans.factory.annotation.Autowired;   import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;   import org.springframework.boot.context.properties.EnableConfigurationProperties;   import org.springframework.context.annotation.Bean;   import org.springframework.context.annotation.Configuration;         @Data   @Configuration   @EnableConfigurationProperties({MinIOConfigProperties.class})   //当引入FileStorageService接口时   @ConditionalOnClass(FileStorageService.class)   public class MinIOConfig {          @Autowired       private MinIOConfigProperties minIOConfigProperties;          @Bean       public MinioClient buildMinioClient() {           return MinioClient                   .builder()                   .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())                   .endpoint(minIOConfigProperties.getEndpoint())                   .build();       }   } 

MinIOConfigProperties

package com.ruoyi.minio.config;         import lombok.Data;   import org.springframework.boot.context.properties.ConfigurationProperties;      import java.io.Serializable;      @Data   @ConfigurationProperties(prefix = "minio")  // 文件上传 配置前缀file.oss   public class MinIOConfigProperties implements Serializable {          private String accessKey;       private String secretKey;       private String bucket;       private String endpoint;       private String readPath;   } 

三、导入工具类

Service

package com.ruoyi.minio.service;      import java.io.InputStream;       public interface FileStorageService {             /**        *  上传图片文件        * @param prefix  文件前缀        * @param filename  文件名        * @param inputStream 文件流        * @return  文件全路径        */       public String uploadImgFile(String prefix, String filename,InputStream inputStream);          /**        *  上传html文件        * @param prefix  文件前缀        * @param filename   文件名        * @param inputStream  文件流        * @return  文件全路径        */       public String uploadHtmlFile(String prefix, String filename,InputStream inputStream);          /**        * 删除文件        * @param pathUrl  文件全路径        */       public void delete(String pathUrl);          /**        * 下载文件        * @param pathUrl  文件全路径        * @return        *        */    public byte[]  downLoadFile(String pathUrl);      } 

ServiceImpl

package com.heima.file.service.impl;   import com.heima.file.config.MinIOConfig; import com.heima.file.config.MinIOConfigProperties; import com.heima.file.service.FileStorageService; import io.minio.GetObjectArgs; import io.minio.MinioClient; import io.minio.PutObjectArgs; import io.minio.RemoveObjectArgs; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Import; import org.springframework.util.StringUtils;  import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date;  @Slf4j @EnableConfigurationProperties(MinIOConfigProperties.class) @Import(MinIOConfig.class) public class MinIOFileStorageService implements FileStorageService {      @Autowired     private MinioClient minioClient;      @Autowired     private MinIOConfigProperties minIOConfigProperties;      private final static String separator = "/";      /**      * @param dirPath      * @param filename  yyyy/mm/dd/file.jpg      * @return      */     public String builderFilePath(String dirPath,String filename) {         StringBuilder stringBuilder = new StringBuilder(50);         if(!StringUtils.isEmpty(dirPath)){             stringBuilder.append(dirPath).append(separator);         }         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");         String todayStr = sdf.format(new Date());         stringBuilder.append(todayStr).append(separator);         stringBuilder.append(filename);         return stringBuilder.toString();     }      /**      *  上传图片文件      * @param prefix  文件前缀      * @param filename  文件名      * @param inputStream 文件流      * @return  文件全路径      */     @Override     public String uploadImgFile(String prefix, String filename,InputStream inputStream) {         String filePath = builderFilePath(prefix, filename);         try {             PutObjectArgs putObjectArgs = PutObjectArgs.builder()                     .object(filePath)                     .contentType("image/jpg")                     .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)                     .build();             minioClient.putObject(putObjectArgs);             StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());             urlPath.append(separator+minIOConfigProperties.getBucket());             urlPath.append(separator);             urlPath.append(filePath);             return urlPath.toString();         }catch (Exception ex){             log.error("minio put file error.",ex);             throw new RuntimeException("上传文件失败");         }     }      /**      *  上传html文件      * @param prefix  文件前缀      * @param filename   文件名      * @param inputStream  文件流      * @return  文件全路径      */     @Override     public String uploadHtmlFile(String prefix, String filename,InputStream inputStream) {         String filePath = builderFilePath(prefix, filename);         try {             PutObjectArgs putObjectArgs = PutObjectArgs.builder()                     .object(filePath)                     .contentType("text/html")                     .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)                     .build();             minioClient.putObject(putObjectArgs);             StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());             urlPath.append(separator+minIOConfigProperties.getBucket());             urlPath.append(separator);             urlPath.append(filePath);             return urlPath.toString();         }catch (Exception ex){             log.error("minio put file error.",ex);             ex.printStackTrace();             throw new RuntimeException("上传文件失败");         }     }      /**      * 删除文件      * @param pathUrl  文件全路径      */     @Override     public void delete(String pathUrl) {         String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");         int index = key.indexOf(separator);         String bucket = key.substring(0,index);         String filePath = key.substring(index+1);         // 删除Objects         RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();         try {             minioClient.removeObject(removeObjectArgs);         } catch (Exception e) {             log.error("minio remove file error.  pathUrl:{}",pathUrl);             e.printStackTrace();         }     }       /**      * 下载文件      * @param pathUrl  文件全路径      * @return  文件流      *      */     @Override     public byte[] downLoadFile(String pathUrl)  {         String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");         int index = key.indexOf(separator);         String bucket = key.substring(0,index);         String filePath = key.substring(index+1);         InputStream inputStream = null;         try {             inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());         } catch (Exception e) {             log.error("minio down file error.  pathUrl:{}",pathUrl);             e.printStackTrace();         }          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();         byte[] buff = new byte[100];         int rc = 0;         while (true) {             try {                 if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;             } catch (IOException e) {                 e.printStackTrace();             }             byteArrayOutputStream.write(buff, 0, rc);         }         return byteArrayOutputStream.toByteArray();     } }  

四、使用工具类上传文件并返回url

  package com.ruoyi.web.controller.utils;      import com.ruoyi.common.core.domain.AjaxResult;   import com.ruoyi.minio.service.impl.MinIOFileStorageService;   import org.springframework.beans.factory.annotation.Autowired;   import org.springframework.web.bind.annotation.GetMapping;   import org.springframework.web.bind.annotation.PostMapping;   import org.springframework.web.bind.annotation.RequestMapping;   import org.springframework.web.bind.annotation.RestController;   import org.springframework.web.multipart.MultipartFile;      import java.io.FileOutputStream;   import java.io.IOException;   import java.io.InputStream;   @RestController   @RequestMapping("/minio")   public class MinioController {       @Autowired       MinIOFileStorageService minIOFileStorageService;          @PostMapping("/fileupload")       public AjaxResult minIo(MultipartFile multipartFile){              // 检查multipartFile是否为空           if (multipartFile == null || multipartFile.isEmpty()) {               return AjaxResult.error("文件为空,无法处理。");           }           try(InputStream inputStream = multipartFile.getInputStream()) {  // 将MultipartFile转换为InputStream               // 上传到MinIO服务器             // 这里的文件名可以生成随机的名称,防止重复             String url = minIOFileStorageService.uploadImgFile("testjpg", "test1.jpg", inputStream);               return AjaxResult.success(url);           } catch (IOException e) {               // 处理异常,可能是getInputStream()失败               return AjaxResult.error("获取InputStream失败:" + e.getMessage());           }       }      }  

上传成功后在浏览器中访问图片的url就可以看到图片了。

在这里插入图片描述

注意事项(问题解决):

如果出现下面这个问题,检查两个地方

在这里插入图片描述

1、桶的权限问题

这里必须是public
在这里插入图片描述

2、url路径问题

如果桶配置没问题那就一定是url路径不对,去代码中排查这个问题就可以了。

我这里出现这个问题是因为在配置文件的前缀中多配置了一级test,导致url路径不正确

# MinIO读取路径前缀   readPath: http://192.168.200.128:9000/test 

相关内容

热门资讯

微扑克教程!德扑之星带入记分牌... 微扑克教程!德扑之星带入记分牌(wepoke有挂)其实真的是有挂(有挂科技);科技详细教程小薇《48...
七分钟透明挂!wepoke科技... wepoke科技赢率提升策略‌;七分钟透明挂!wepoke科技"德州之星外挂(原来真的有挂)-哔哩哔...
透视普及!微扑克软件发牌管理,... 透视普及!微扑克软件发牌管理,微扑克德州专用辅助器(其实真的有挂)1)微扑克德州专用辅助器辅助挂:进...
AI教程!wepoke挂真的假... AI教程!wepoke挂真的假的(wpk透视辅助测试)其实真的有挂(有挂方法)1、每一步都需要思考,...
2分钟透视!nzt德州辅助软件... 2分钟透视!nzt德州辅助软件基本了解"智星德州菠萝开挂(其实真的有挂)-哔哩哔哩2分钟透视!nzt...
可靠教程!wepoke黑科技是... 您好,wepoke黑科技是啥这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多...
透视科普!wpk德州ai,微扑... 透视科普!wpk德州ai,微扑克wpk辅助存在(原来真的有挂)1、操作简单,无需注册,只需要使用手机...
六分钟总结!pokermast... 六分钟总结!pokermastersteam外挂"德州之星辅助(其实真的有挂)-哔哩哔哩1、任何po...
微扑克教程!德扑之星怎么操作(... 微扑克教程!德扑之星怎么操作(微扑克辅助软件)其实真的有挂(有挂科技)1、德扑之星怎么操作系统规律教...
7分钟辅助挂!德扑之星怎么查数... 7分钟辅助挂!德扑之星怎么查数据"wepoke有辅助挂(原来真的有挂)-哔哩哔哩;科技详细教程小薇《...