MinIO


MinIO 是一個非常輕量的基於 Apache License v2.0 開源協議的對象存儲服務。它兼容亞馬遜 S3 雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾 kb 到最大 5T 不等。

一、MinIO 服務部署

1.1 下載安裝包

本文使用 CentOS 7,安裝包地址(中國鏡像):http://dl.minio.org.cn/server/minio/release/linux-amd64/minio

1.2 啟動服務

chmod +x minio
./minio server /project/miniodata/

其中 /project/miniodata/ 是文件存儲位置,默認端口是 9000,AccessKey 和 SecretKey 均為 minioadmin

也可以手動指定端口號:

./minio server --address :9001 /project/miniodata/

也可以手動修改 AccessKey 和 SecretKey:

vi /etc/profile

#在最后添加內容
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=password

# 然后執行命令
source /etc/profile

二、Java SDK 使用

2.1 新建項目添加配置

minio:
  url: http://192.168.137.101:9000
  accessKey: minioadmin
  secretKey: minioadmin

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

2.2 上傳、下載、文件分享代碼

@RestController
public class MinioController {

    @Autowired
    private MinioProperties minioProperties;

    @PostMapping("/upload")
    public String upload(UploadModel uploadModel) {

        if(StringUtils.isEmpty(uploadModel.getFileName())) {
            uploadModel.setFileName(uploadModel.getFile().getOriginalFilename());
        }

        try {
            // 使用 MinIO 服務的 IP:PORT,Access key 和 Secret key 創建一個 MinioClient 對象
            MinioClient minioClient = new MinioClient(
                    minioProperties.getUrl(), minioProperties.getAccessKey(), minioProperties.getSecretKey());

            // 檢查存儲桶是否已經存在
            boolean isBucketExist = minioClient.bucketExists(uploadModel.getBucket());
            if(!isBucketExist) {
                minioClient.makeBucket(uploadModel.getBucket());
            }

            PutObjectOptions putObjectOptions = new PutObjectOptions(uploadModel.getFile().getSize()
                    , uploadModel.getFile().getSize() >= 5242880L ? uploadModel.getFile().getSize() : 0L);

            minioClient.putObject(uploadModel.getBucket(), uploadModel.getFileName(),
                    uploadModel.getFile().getInputStream(), putObjectOptions);

        } catch (Exception e) {
            return e.getMessage();
        }
        return "success";
    }

    @RequestMapping("/download")
    public ResponseEntity<Resource> download(DownloadModel downloadModel) {
        try {
            MinioClient minioClient = new MinioClient(
                    minioProperties.getUrl(), minioProperties.getAccessKey(), minioProperties.getSecretKey());

            InputStream inputStream = minioClient.getObject(downloadModel.getBucket(), downloadModel.getFileName());
            Resource resource = new InputStreamResource(inputStream);
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION,
                            "attachment;filename=\"" +
                                    downloadModel.getFileName().replace('/', '-') + "\"")
                    .body(resource);
        } catch (Exception e) {
            return null;
        }
    }

    @RequestMapping("/share")
    public String share(DownloadModel downloadModel) {
        try {
            MinioClient minioClient = new MinioClient(
                    minioProperties.getUrl(), minioProperties.getAccessKey(), minioProperties.getSecretKey());

            String url = minioClient.presignedGetObject(downloadModel.getBucket(), downloadModel.getFileName(), 120);
            return url;
        } catch (Exception e) {
            return e.getMessage();
        }
    }
}

新建一個 Bucket 就是在文件路徑新建一個目錄,默認上傳的文件都在該 Bucket 的根目錄,如果要存儲多級目錄,可以指定在文件名中指定目錄結構,如:img/avatar.jpg

注意校正 MinIO 服務器時間,否則可能會報錯:

Caused by: io.minio.errors.ErrorResponseException: The difference between the request time and the server's time is too large.

完整代碼:GitHub

參考:MinIO 中文文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM