MinIO简介和java Api的使用

本文出自jvm123.com-java技术分享站:http://jvm123.com/2020/02/minio-jian-jie-java-api.html

MinIO是一个对象存储服务,非常轻量,也提供了多种语言的api,可以非常方便使用。

存储桶

minio中的bucket桶

MinIO将存储空间分为多个部分,称为bucket桶,文件(对象)就存储在各个bucket桶中

桶策略

这些bucket桶可以根据用户的需要进行创建和删除。此外可以对每个bucket桶设置匿名用户访问的策略,具体策略说明如下:

  • ReadOnly – 允许匿名下载访问包括能够列出所需前缀的对象
  • WriteOnly – 允许匿名上传包括能够列出所需前缀的不完整上传
  • 读写 – 匿名访问以上载和下载所有对象
  • 无 – 是默认值(无策略),这意味着所有操作都需要针对所需的存储桶和前缀进行身份验证

Java Api

依赖:

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

java api 通过一个http客户端进行存储和获取对象文件,所以java代码中可以通过以下的步骤进行存储和获取:

1 实例化一个MinioClient客户端:

MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);

2 创建存储桶bucket:

            String bucket = "demo-bucket";
            boolean isExist = minioClient.bucketExists(bucket);
            if(isExist) {
                LOGGER.info("Bucket {} already exists.", bucket);
            } else {
                minioClient.makeBucket(bucket);
            }

3 存储文件对象(需要指定存储的桶):

minioClient.putObject(bucket, destFileName, file.getAbsolutePath());

因为MinioClient使用http客户端,并不是长连接,所以不需要进行关闭连接和释放资源的操作。

至此,文件已经存储完毕,可以在Minio服务器查询看到,bucket中的文件

4 获取对象文件如下(获取输入流InputStream):


    public InputStream getStream(String bucket, String fileName) {
        InputStream is = null;
        try {
            MinioClient minioClient = ...; // 再实例化一个客户端
            is = minioClient.getObject(bucket, fileName);
        } catch(MinioException | NoSuchAlgorithmException | IOException | XmlPullParserException | InvalidKeyException e) {
            LOGGER.error("error: {}", e.getMessage());
        }
        return is;
    }

如果需要获取File对象:

    public File getFile(String bucket, String fileName) {
        InputStream is = getStream(bucket, fileName);
        File dir = new File(tmpDir);
        if (!dir.exists() || dir.isFile()) {
            dir.mkdirs();
        }
        File file = new File(tmpDir + fileName);
        try {
            FileUtils.copyToFile(is, file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

如果需要下载文件,可以直接将输入流写入servlet输出流即可:

public void writeTo(String bucket, String fileName, OutputStream os) throws IOException {
    InputStream is = getStream(bucket, fileName);
    byte[] bytes = new byte[1024];
    int len;
    while ((len = is.read(bytes)) != -1) {
        os.write(bytes, 0, len);
    }
    os.flush();
}

 

posted on 2020-06-19 15:51  instr  阅读(10108)  评论(0编辑  收藏  举报

导航