Springboot整合MinIo

229 阅读3分钟

Springboot整合MinIo

一、添加依赖

//若最新版的启动时报错,请降低版本
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.1</version>
</dependency>

二、添加配置

# minio 参数配置
minio:
  endpoint: 你的minio api IP
  accessKey: 你的用户名
  secretKey: 你的密码
  bucketName: 桶名称

三、编写配置类

@Configuration
@Data
public class MinIoClientConfig {

    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.bucketName}")
    private String bucketName;

    /**
     * 注入minio 客户端
     * @return
     */
    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
}

四、编写工具类(或业务代码)

@Component
@Slf4j
public class MinioUtil {

    private static final String FILE_NAME_PATTERN = "{}_{}";
    private static final int RESPONSE_SUCCESS_CODE = 200;

    @Autowired
    private MinioClient minioClient;

    /**
     * description: 判断bucket是否存在
     *
     * @param bucketName 桶名称
     * @return: void
     * @time: 2022/8/17 15:03
     */
    public boolean bucketExists(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    }

    /**
     * description: 创建bucket
     *
     * @param bucketName 桶名称
     * @return: void
     * @time: 2022/8/17 15:03
     */
    public void createBucket(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!isExist) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    /**
     * description: 获取全部bucket
     *
     * @return: void
     * @time: 2022/8/17 15:03
     */
    public List<Bucket> getAllBuckets() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        return minioClient.listBuckets();
    }

    /**
     * description: 上传文件并返回文件名称
     *
     * @param bucketName 桶名称
     * @param file       MultipartFile文件流
     * @return: java.lang.String
     * @time: 2021/08/19
     */
    public String upload(MultipartFile file, String bucketName) throws Exception {
        //判断桶是否存在
        boolean b = this.bucketExists(bucketName);
        if (!b) {
            this.createBucket(bucketName);
        }
        // 上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();
        // 文件大小
        long fileSize = file.getSize();
        log.info("上传文件的原始文件名:{},文件大小:{},文件类型为:{}", originalFilename, fileSize, file.getContentType());
        // 文件名:日期_原始文件名
        String fileName = StrUtil.format(FILE_NAME_PATTERN, DateUtil.format(new Date(), "yyyyMMddHHmmss"), originalFilename);
        log.info("格式化后的文件名:{}", fileName);
        try {
            minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
                    .object(fileName).stream(file.getInputStream(), fileSize, -1).contentType(file.getContentType()).build());
        } catch (Exception e) {
            log.info("上传文件失败!" + e.getMessage());
        }
        return fileName;
    }

    /**
     * description: 上传文件并返回文件名称
     *
     * @param bucketName 桶名称
     * @param file       MultipartFile文件流
     * @return: java.lang.String
     * @time: 2021/08/19
     */
    public String upload(MultipartFile file, String bucketName, String name, String type) throws Exception {
        //判断桶是否存在
        boolean b = this.bucketExists(bucketName);
        if (!b) {
            this.createBucket(bucketName);
        }
        if (type == null) {
            type = file.getContentType();
        }
        if (name == null) {
            // 上传文件的原始文件名
            name = file.getOriginalFilename();
        }
        // 文件大小
        long fileSize = file.getSize();
        log.info("上传文件的原始文件名:{},文件大小:{},文件类型为:{}", name, fileSize, type);
        // 文件名:日期_原始文件名
        String fileName = StrUtil.format(FILE_NAME_PATTERN, DateUtil.format(new Date(), "yyyyMMddHHmmss"), name);
        log.info("格式化后的文件名:{}", fileName);
        try {
            minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
                    .object(fileName).stream(file.getInputStream(), fileSize, -1).contentType(type).build());
        } catch (Exception e) {
            log.info("上传文件失败!" + e.getMessage());
        }
        return fileName;
    }

    /**
     * description: 获取文件url并设置过期时间
     *
     * @param bucketName 桶名称
     * @param fileName   文件名称
     * @param expires    过期时间(不指定默认为7200秒)
     * @return: url 文件路径
     * @time: 2021/08/19
     */
    public String getFileUrl(String bucketName, String fileName, Integer expires) throws Exception {
        BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();
        boolean bucketExists = minioClient.bucketExists(bucketArgs);
        if (expires == null) {
            expires = 60 * 60 * 2;
        }
        String url = "";
        if (bucketExists) {
            GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(fileName)
                    .expiry(expires)
                    .build();
            url = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);
        }
        return url;
    }

    /**
     * description: 下载文件
     *
     * @param bucketName 桶名称
     * @param fileName   文件名称
     * @return: byte[]  文件数组
     * @time: 2021/08/19
     */
    public byte[] download(String bucketName, String fileName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();
        boolean bucketExists = minioClient.bucketExists(bucketArgs);
        log.info("bucketExists:{}", bucketExists);
        InputStream stream = minioClient.getObject(
                GetObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .build());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buff = new byte[100];
        int rc = 0;
        while((rc=stream.read(buff, 0, 100))>0) {
            baos.write(buff, 0, rc);
        }
        return baos.toByteArray();
    }
}

五、测试接口

@RestController
@RequestMapping("/minio")
public class MinIoController {

    @Autowired
    private MinioUtil minioUtil;
    @Autowired
    private MinIoClientConfig minIoClientConfig;

    @PostMapping("uploadFile")
    public void uploadFile(@RequestParam("image") MultipartFile multipartFile){
        try {
            minioUtil.upload(multipartFile,minIoClientConfig.getBucketName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

六、补充

docker安装minio命令

docker run \                       
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio1 \
  -v ~/minio/data:workSpace/minio \ 
  -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" 
  -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
  quay.io/minio/minio server /data --console-address ":9001"

-v:文件存放的本地目录
-e:用户名和密码
MinIo官网地址:min.io/docs/minio/…
本片记录纯粹是为了方便自己之后复习的时候使用观看,如有错误,望请指点!