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

文章介绍了Minio,一个由GlusterFS创始人发布的开源对象存储项目,适用于私有云环境,主要存储大量非结构化数据如图片、视频等。文章提供了在Java环境下配置Minio的步骤,包括添加依赖、配置信息,以及展示了一个用于文件上传、下载、状态检查和删除的Minio工具类示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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<String> getFileListMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
        Iterable<Result<Item>> files = null;
        List<String> 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<Item> 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系统中的路径

首先,需要引入minio的依赖: ``` <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.0.2</version> </dependency> ``` 然后,在application.properties中配置minio的连接信息: ``` minio.url=http://localhost:9000 minio.accessKey=minioadmin minio.secretKey=minioadmin minio.bucketName=test ``` 接着,创建一个MinioService类,用于处理文件上传和下载: ``` @Service public class MinioService { @Value("${minio.url}") private String minioUrl; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Value("${minio.bucketName}") private String bucketName; private final MinioClient minioClient = new MinioClient(minioUrl, accessKey, secretKey); public void upload(MultipartFile file) throws Exception { // 生成文件名 String originalFilename = file.getOriginalFilename(); String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); // 上传文件 minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); } public InputStream download(String fileName) throws Exception { // 下载文件 return minioClient.getObject(GetObjectArgs.builder() .bucket(bucketName) .object(fileName) .build()); } } ``` 最后,在Controller中使用MinioService处理上传和下载请求: ``` @RestController public class MinioController { @Autowired private MinioService minioService; @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile[] files) { try { for (MultipartFile file : files) { minioService.upload(file); } return "上传成功"; } catch (Exception e) { e.printStackTrace(); return "上传失败"; } } @GetMapping("/download") public ResponseEntity<InputStreamResource> download(@RequestParam("fileName") String fileName) { try { InputStream inputStream = minioService.download(fileName); InputStreamResource inputStreamResource = new InputStreamResource(inputStream); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment; filename=" + fileName); return ResponseEntity.ok().headers(headers).contentLength(inputStream.available()) .contentType(MediaType.parseMediaType("application/octet-stream")).body(inputStreamResource); } catch (Exception e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); } } } ``` 这样,就可以使用Spring BootMinio实现多文件批量上传了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值