SpringBoot整合minio,文件的上传下载,批量获取

Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。基于Apache License v2.0开源协议的对象存储项目,采用Golang实现,客户端支Java,Python,Javacript, Golang语言。

其设计的主要目标是作为私有云对象存储的标准方案。主要用于存储海量的图片,视频,文档等。非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

minio的服务部署这里就不叙述了。

1.pom.xml中引用minio的依赖


    io.minio
    minio
    8.5.3

2.application.yml配置文件中配置minio的信息

minio:
  accessKey: ********
  secretKey: **********
  bucketName: yanliang
  endPoint: http://127.0.0.1:9000  #换成自己的minio服务器地址
  url: http://127.0.0.1:9000
  #文件的过期时间(分钟)
  expires: 5

3.写一个minio的工具类UploadMinioUtil

package com.yunmao.yanliang.util;

import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.Result;
import io.minio.errors.MinioException;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

/**
 * minio工具类
 * @author 言凉
 */
@Component
public class UploadMinioUtil {
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Value("${minio.endPoint}")
    private String endPoint;
    @Value("${minio.url}")
    private String url;
    @Value("${minio.expires}")
    private int expires;

    /**
     * 上传文件至Minio文件系统
     *
     * @param objectName 存在Minio系统中的路径
     * @param filePath   上传文件的路径
     * @return
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws XmlPullParserException
     */
    public String uploadFileMinio(String objectName, String filePath) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
        String fileUrl = "";
        try {
            // 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
            MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);

            // 检查存储桶是否已经存在
            boolean isExist = minioClient.bucketExists(bucketName);
            if (isExist) {
                System.out.println("Bucket already exists.");
            } else {
                // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
                minioClient.makeBucket(bucketName);
            }
            // 使用putObject上传一个文件到存储桶中。
            minioClient.putObject(bucketName, objectName, filePath);
            // 返回对象名
            fileUrl = objectName;
        } catch (MinioException e) {
            e.printStackTrace();
        }

        return fileUrl;
    }

    /**
     * 查询Minio文件系统中文件的url
     *
     * @param objectName 文件路径
     * @return
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws XmlPullParserException
     * @throws MinioException
     */
    public String getFileMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
        String newFileUrl = "";
        try {
            // 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
            MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);

            // 使用putObject上传一个文件到存储桶中。
            String fileUrl = minioClient.presignedGetObject(bucketName, objectName, 60 * expires);
            URL u = new URL(fileUrl);
            String file = u.getFile();
            newFileUrl = url + file;
        } catch (MinioException e) {
            e.printStackTrace();
        }
        return newFileUrl;
    }

    /**
     * 查询Minio文件系统中文件是否存在
     *
     * @param objectName
     * @return
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws XmlPullParserException
     * @throws MinioException
     */
    public Boolean statFileMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
        Boolean isExist = false;
        try {
            // 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
            MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);
            // 获得对象的元数据。
            ObjectStat objectStat = minioClient.statObject(bucketName, objectName);
            isExist = true;
        } catch (MinioException e) {
            e.printStackTrace();
            isExist = false;
        }

        return isExist;
    }

    /**
     * 删除Minio文件系统中的文件
     *
     * @param objectName 文件路径
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws XmlPullParserException
     * @throws MinioException
     */
    public void deleteFileMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
        try {
            // 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
            MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);

            // 从mybucket中删除myobject。
            minioClient.removeObject(bucketName, objectName);

        } catch (MinioException e) {
            e.printStackTrace();
        }
    }
    /**
     * 批量获取minio文件夹下的所有文件
     *
     * @param objectName 文件路径
     * @return
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws XmlPullParserException
     * @throws MinioException
     */
    public List getFileListMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
        Iterable> files = null;
        List list = new ArrayList<>();
        try {
            // 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
            MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);

            // 使用putObject上传一个文件到存储桶中。
            files = minioClient.listObjects(bucketName,objectName);
            for(Result result: files){
                String objName=result.get().objectName();
                String fileurl = this.getFileMinio(objName);
                list.add(fileurl);
            }

        } catch (MinioException e) {
            e.printStackTrace();
        }
        return list;
    }
}

4.实现,在需要对接minio的地方先注入minio工具类

@Autowired
private UploadMinioUtil uploadMinioUtil;

实现用uploadMinioUtil.方法实现文件的上传,下载,删除,批量获取等操作

说明:方法中的objectName值为文件在minio系统中的路径

你可能感兴趣的:(java,spring,boot)