springboot项目整合minio实现文件的分布式存储

minio是一款分布式存储系统,上一篇详细介绍了minio在windows环境下的搭建集群并通过nginx实现负载均衡,这里简单介绍下springboot项目整合minio并实现文件的上传下载删除等操作。

一、依赖的引入

1.1、maven项目

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

1.2、普通项目

普通项目采用手动引入jar包方式会挺麻烦的,推荐使用maven来引入依赖
普通项目使用minio需要引入jar包大致包括minio-8.3.0.jar ; okio-2.5.0.jar ; okhttp-4.8.1.jar ; guava-22.0.jar

二、minio配置类

@Configuration
@Slf4j
public class MinioConfig {


    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Value("${minio.bucketName}")
    private String bucketName;

    @Bean
    public MinioClient minioClient(){
        MinioClient minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
        try {
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if(!found){
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
                log.info("minio初始化桶:"+bucketName);
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return minioClient;
    }
}

其中四个变量为application.yml中的配置,MinioConfig.java配置文件创建了minio分布式存储系统的操作客户端minioClient并交给springboot进行管理,且创建了名为java-bucket的桶。

# 分布式存储minio相关配置
minio:
  # 分布式存储的服务地址,要做集群的话则是通过nginx配置负载均衡,该地址指向nginx入口
  endpoint: http://127.0.0.1:9001
  # 分布式存储系统对应的用户名和密码
  accessKey: minioadmin
  secretKey: minioadmin
  # 所有文件均存储在该名称对应的桶中
  bucketName: java-bucket

三、通过minioClient操作文件

@Component
public class minioUtil{

	private static MinioClient minioClient;
	
	private static String bucketName;

	// 由于静态方法中只能用静态变量,而静态变量无法直接实现注入,为此通过非静态的set方法注入值
	@Value("${minio.bucketName}")
    public void setBucketName(String bucketName) {
        fileUtils.bucketName = bucketName;
    }

    @Autowired
    public void setMinioClient(MinioClient minioClient) {
        fileUtils.minioClient = minioClient;
    }


	// 将本地文件夹整个上传至minio存储系统,其中dirName表示上传的文件夹路径如 C:/admin/testDir ,len表示对源路径的截取长度,使其上传至minio存储系统保持相对路径,比如C:/admin/testDir/test.txt 截取成 admin/testDir/test.txt
    public static void minio_uploadFile(String dirName,int len){
        List<String> filePathList = new ArrayList<>();
        File file = new File(dirName);
        minio_recursionGetFileList(file,filePathList);
        for (String s : filePathList) {
            minio_uploadSingleFile(s.substring(len,s.length()),s);
        }

    }
	
	// 递归获取parentFile文件夹下的所有文件目录
    private static void minio_recursionGetFileList(File parentFile, List<String> filePathList) {
        File[] files = parentFile.listFiles();
        for (File file : files) {
            if(file.isFile()){
                filePathList.add(file.getPath());
            }else {
                 minio_recursionGetFileList(file,filePathList);
            }
        }

    }
	
	// 本地单个文件的上传
    public static void minio_uploadSingleFile(String objectName,String fileName){
        objectName = objectName.replace("\\","/");
        // 上传文件
        try {
            minioClient.uploadObject(UploadObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)  // 上传到分布式系统的文件名称
                    .filename(fileName) // 本地文件路径
                    .build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }



	//  删除minio存储系统bucketName桶中文件
	//  objectName为要删除的文件名,如要删除b文件夹下的test.txt,则objectName应为"b/test.txt"
    private static void minio_deleteFile(String objectName){
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
        } catch (Exception e) {
            log.error("删除minio中文件出现错误:"+e.getMessage());
        }
    }

	// minio存储系统中下载objectName的文件到fileName,如下载objectName = "b/test.txt" , fileName = "C:/test1.txt"
    private static void minio_downloadFile(String objectName,String fileName){
        try {
            minioClient.downloadObject(DownloadObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .filename(fileName)
                        .build());
        } catch (Exception e) {
            log.info("下载minio文件出现错误:"+e.getMessage());
        }
    }

	// 获取minio的bucketName桶的所有文件列表
    private static void minio_getFileList(){
        // 获取文件列表
            Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
            Iterator<Result<Item>> iterator = results.iterator();
            List<Object> items = new ArrayList<>();
            String format = "{'fileName':'%s','fileSize':'%s'}";
        try {
            while (iterator.hasNext()){
                Item item = iterator.next().get();
                System.out.println(item.objectName());
                System.out.println(item.size());
            }
        } catch (Exception e) {
            log.error("获取minio中文件列表出错:"+e.getMessage());
        }
    }



    /**
     * @description 多文件上传至minio系统
     */

    public static void uploadToMinio(List<MultipartFile> multipartFiles,String dir) {

        for (int i = 0; i < multipartFiles.size(); i++) {
            minio_uploadFile(multipartFiles.get(i),multipartFiles.get(i).getName(),dir);
        }
    }

	private static void minio_uploadFile(MultipartFile file,String objectName,String dir){
        try {
            InputStream inputStream = file.getInputStream();
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(dir+"/"+objectName)
                            .contentType(file.getContentType())
                            .stream(inputStream, inputStream.available(), -1)
                            .build());
        } catch (Exception e) {
            log.error("文件上传至minio出错:"+e.getMessage());
        }
    }

	// 将minio存储系统中整个dir目录全部删除
    public static void deleteDirFromMinio(String dir){

            try {
                Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).delimiter(dir).prefix(dir+"/").build());
                for (Result<Item> itemResult : results) {
                    Item item = itemResult.get();
                    minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(item.objectName()).build());
                }
            } catch (Exception e) {
                log.error("删除minio中文件出现错误:"+e.getMessage());
            }

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值