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();
}