MinIO使用

MinIO使用

MiniO 单机部署以及使用

[中文官方文档](MinIO Quickstart Guide| Minio中文文档)

1. docker-compose部署

version: '3'
services:
  minio:
    image: minio/minio
    hostname: "minio"
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: admin  #管理后台用户名
      MINIO_ROOT_PASSWORD: admin123321  #管理后台密码,最小8个字符
    volumes:
      - /Users/docker/minio/data:/data            #映射当前目录下的data目录至容器内/data目录
      - /Users/docker/minio/config:/root/.minio/     #映射配置目录
    command: server --console-address ':9001' /data  #指定容器中的目录 /data
    privileged: true
    restart: always

2.登陆管理页面

3.上传代码

配置文件

    minio:
      endpoint: http://118.31.114.52:9000/
      accessKey: admin
      secretKey: admin123321
      bucketName: kma-bucket #存储桶
      region: us-east-1 #默认(美国东区1),这也是亚马逊S3的默认区域 你可以通过MINIO_REGION 环境变量进行修改。如果不了解这块,建议不要随意修改

读取配置文件

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Minio {
  private String   endpoint;
    private String  accessKey;
    private String  secretKey;
    private String  bucketName;
    private String region;
}

工具类

/**
 * created with IntelliJ IDEA.
 *
 * @author: yz
 * @date: 2022/1/23
 * @time: 8:07 下午
 * @description:
 */
@Slf4j
@AllArgsConstructor
public class MinioUtil {

    private final MinioClient client;

    /**
     * 创建bucket
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public void createBucket(String bucketName) {
        if (!client.bucketExists(bucketName)) {
            client.makeBucket(bucketName);
        }
    }

    /**
     * 获取全部bucket
     */
    @SneakyThrows
    public List<Bucket> getAllBuckets() {
        return client.listBuckets();
    }

    /**
     * 根据bucketName获取信息
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public Optional<Bucket> getBucket(String bucketName) {
        return client.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
    }

    /**
     * 根据bucketName删除信息
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public void removeBucket(String bucketName) {
        client.removeBucket(bucketName);
    }

    /**
     * 获取文件外链
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param expires    过期时间 <=7
     * @return url
     */
    @SneakyThrows
    public String getObjectURL(String bucketName, String objectName, Integer expires) {
        return client.presignedGetObject(bucketName, objectName, expires);
    }

    /**
     * 获取文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @return 二进制流
     */
    @SneakyThrows
    public InputStream getObject(String bucketName, String objectName) {
        return client.getObject(bucketName, objectName);
    }

    /**
     * 获取文件信息
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject
     */
    public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {
        return client.statObject(bucketName, objectName);
    }

    /**
     * 删除文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#removeObject
     */
    public void removeObject(String bucketName, String objectName) throws Exception {
        client.removeObject(bucketName, objectName);
    }

    /**
     * 上传文件
     *
     * @param file       文件
     * @param bucketName 存储桶
     * @return
     */
    public String uploadFile(MultipartFile file, String bucketName,String region,String fileName) throws Exception {
        // 判断上传文件是否为空
        if (null == file || 0 == file.getSize()) {
            throw new KmaException(ResultEnum.UPLOAD_FILE_CANNOT_BE_EMPTY);
        }
        // 判断存储桶是否存在
        createBucket(bucketName);
        // 开始上传
        BufferedInputStream bis = new BufferedInputStream(file.getInputStream());
        client.putObject(PutObjectArgs.builder()
                .bucket(bucketName)
                .region(region)
                .object(fileName)
                .stream(bis, bis.available(), -1)
                .contentType(file.getContentType())
                .build());
        return client.presignedGetObject(bucketName, fileName);
    }
}

实现代码

/**
 * created with IntelliJ IDEA.
 *
 * @author: yz
 * @date: 2021/12/21
 * @time: 9:36 下午
 * @description:
 */
@RequiredArgsConstructor
public class MinioFileUploadServiceImpl implements FileUploadService {
    private final StorageProperties properties;

    @SneakyThrows
    @Override
    public String upload(MultipartFile file, String path, String fileName) {
        MinioClient minioClient = new MinioClient(properties.getMinio().getEndpoint(), properties.getMinio().getAccessKey(), properties.getMinio().getSecretKey());
        MinioUtil minioUtil = new MinioUtil(minioClient);
       return minioUtil.uploadFile(file,properties.getMinio().getBucketName(),properties.getMinio().getRegion(),path+fileName);
    }

    @SneakyThrows
    @Override
    public void delete(String path) {
        MinioClient minioClient = new MinioClient(properties.getMinio().getEndpoint(), properties.getMinio().getAccessKey(), properties.getMinio().getSecretKey());
        MinioUtil minioUtil = new MinioUtil(minioClient);
        minioUtil.removeObject(properties.getMinio().getBucketName(),path);
    }
}

备注:

还有一种使用方式,后端生成MiniO的token,前端上传,更多操作查看文档

比如分片上传,mysql备份到MiniO