本文出自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(); }