[Minio] SpringBoot integra Minio (código de caso pronto para uso)

Este artigo explica apenas o uso básico do MinIo. Abaixo estão alguns exemplos de códigos prontos para uso, mas preste atenção aos dois conceitos de baldes e objetos. Os dois conceitos de baldes e objetos são explicados abaixo.

Pré trabalho

Um serviço Minio Server precisa ser instalado em um determinado servidor.

Minio depende de

<dependency>
	<groupId>io.minio</groupId>
	<artifactId>minio</artifactId>
	<version>8.3.0</version>
</dependency>

Classe de configuração do MinioClient

configuração do yml

# minio
minio:
  # 服务地址
  endpoint: http://localhost:9000
  # 账号
  accessKey: minioadmin
  # 密码
  secretKey: minioadmin

Classe de configuração do cliente

Aqui, o MinioClient é injetado no Bean e, em seguida, o MinioClient é usado para chamar a API do Minio.

import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class MinIoClientConfig {
    
    

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

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

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

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

}

Operação básica do Minio

Defina uma interface OSSFileService aqui para abstrair a implementação concreta do Minio.
Um conceito 桶(bucket)de . Este balde é usado pelo Minio para dividir dados diferentes. Você pode entendê-lo como uma pasta. No entanto, os baldes têm atributos públicos e privados aqui. Os baldes públicos podem ser navegados casualmente, enquanto os baldes privados precisam ser fornecidos Defina um tempo de navegação, além desse tempo de navegação, você não poderá mais navegar.

objectNameNome do objeto: O nome do objeto pode ser entendido como qual pasta, qual arquivo, o nome do objeto, por exemplo: public/images/111.jpg

OSSFileService

public interface FileService {
    
    

    /**
     * 上传文件
     *
     * @param bucketName 存储桶名称
     * @param input 文件流
     * @param objectName 对象名称
     * @param contentType contentType
     * @return
     */
    void uploadFile(String bucketName, InputStream input, String objectName, String contentType);


    /**
     * 根据对象名称获取公共文件访问路径
     *
     * @param bucketName 存储桶名称
     * @param objectName 对象名称
     */
    String getUrlByBucketNameAndObjectName(String bucketName, String objectName);


    /**
     * 根据对象名称获取文件访问路径
     *
     * @param bucketName 存储桶名称
     * @param objectName 对象名称
     * @param getUrlTime 访问文件路径时间
     * @param timeUnit 访问时间格式
     * @return
     */
    String getUrlByBucketNameAndObjectNameAndTime(String bucketName, String objectName, int getUrlTime, TimeUnit timeUnit);


    /**
     * 根据对象名称和桶名称删除对象
     *
     * @param bucketName 桶名称
     * @param objectName 对象名称
     * @return
     */
    void remove(String bucketName, String objectName);

}
@Service
public class OssFileServiceImpl implements OssFileService {
    
    

    @Autowired
    private MinioClient minioClient;

    @Override
    public void uploadFile(String bucketName, InputStream input, String objectName, String contentType) {
    
    
        try {
    
    
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .contentType(contentType)
                            .stream(input, input.available(), -1)
                            .build());
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                input.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    @Override
    public String getUrlByBucketNameAndObjectName(String bucketName, String objectName) {
    
    
    	return  this.getUrl(bucketName, objectName, 1, TimeUnit.DAYS);
    }

    @Override
    public String getUrlByBucketNameAndObjectNameAndTime(String bucketName, String objectName, int getUrlTime, TimeUnit timeUnit) {
    
    
        return this.getUrl(bucketName, objectName, getUrlTime, timeUnit);
    }

    @Override
    public void remove(String bucketName, String objectName) {
    
    
        try {
    
    
            minioClient.removeObject(RemoveObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .build());
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }


    /**
     * 根据 桶、object、时间 获取文件路径
     *
     * @param bucketName 桶名称
     * @param objectName object
     * @param getUrlTime 时间
     * @param timeUnit 时间格式
     * @return
     */
    private String getUrl(String bucketName, String objectName, int getUrlTime, TimeUnit timeUnit) {
    
    
        try {
    
    
            return minioClient.getPresignedObjectUrl(
                            GetPresignedObjectUrlArgs.builder()
                                .bucket(bucketName)
                                .object(objectName)
                                .expiry(getUrlTime, timeUnit)
                                .method(Method.GET)
                                .build());
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return null;
    }

}

Acho que você gosta

Origin blog.csdn.net/weixin_43657300/article/details/129435898
Recomendado
Clasificación