SpringBoot整合MinIO服务器实现文件上传功能

一.环境准备

MinIO Object Storage for Windows — MinIO Object Storage for Windows

访问官网下载对应的操作系统的MinIO服务器

  • 已windows系统为例

https://dl.min.io/server/minio/release/windows-amd64/minio.exe

下载对应的minio.exe文件

.\minio.exe server C:\minio --console-address :9090

输入以上命令启动本地minio实例,注:需要先进入minio.exe的根路径在输入以上命令,c:\minio最好替换为e:\minio,因为本项目是建立了一个本地存储服务器,所以以后上传的文件都会存储在本地,c:\minio就是文件存储的目录

在浏览器上输入启动框中的http地址,输入RootUser和RootPass,登陆后创建一个存储桶--类似于文件夹

二.什么是minio服务器

Minio服务器是一个开源的对象存储服务器,它兼容Amazon S3云存储服务的API。Minio服务器可以在本地或私有云环境中部署,提供可扩展的、高性能的对象存储解决方案。

Minio服务器的主要特点包括:

  1. 对象存储:Minio服务器可以存储各种类型的对象,如图片、视频、文档等。

  2. 分布式架构:Minio服务器支持分布式部署,可以通过添加多个服务器节点来实现数据的冗余备份和负载均衡。

  3. 高可用性:Minio服务器提供了数据冗余和自动故障转移机制,确保数据的可靠性和高可用性。

  4. 基于HTTP的API:Minio服务器使用HTTP协议提供API接口,可以通过简单的HTTP请求来上传、下载、删除和管理存储的对象。

  5. 安全性:Minio服务器支持多种安全机制,如访问控制列表(ACL)、加密传输(HTTPS)和身份验证(Access Key和Secret Key)等,以保护存储的数据安全。

  6. 可扩展性:Minio服务器可以根据需求进行水平扩展,通过添加更多的服务器节点来提高存储容量和性能。

Minio服务器的开源性质使得它成为了一个受欢迎的对象存储解决方案,适用于各种场景,包括数据备份、云原生应用、大数据分析等。

三.SpringBoot代码实现

  • 导入依赖
    <!-- Minio -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.1.0</version>
    </dependency>
<!-- HttpClient用来发送http请求和接受响应-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>
  • 文件配置
    # Minio配置
    minio:
      endpoint:  
      accessKey: 
      secretKey: 

minio启动成功后:

Console中的http地址是访问地址endpoint:需要输入的内容

RootUser中的minioadmin是访问密钥accessKey:中需要输入的内容

RootPass中的minioadmin是访问密钥的密钥secretKey:中需要输入的内容

  • 代码实现

代码上传

 

public String upload(MultipartFile file) throws IOException {

        String fileName = UUID.randomUUID().toString() + "-" + file.getOriginalFilename();
        Method method = Method.GET;
        // 上传文件到Minio服务器
        try {
            minioClient.putObject(
                    PutObjectArgs.builder()
                            //创建的存储桶
                            .bucket("files")
                            .object(fileName)
                            .stream(file.getInputStream(), file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build()
            );
            String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .bucket("files")
                    .object(fileName)
                    .method(method)
                    .build());
            log.debug("服务器返回url地址{}", url);
            return url;
        } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
                 InvalidResponseException | NoSuchAlgorithmException | XmlParserException | ServerException e) {
            String message = "连接minio服务器异常,请联系管理员!";
            throw new ServiceException(ServiceCode.ERROR_UNKNOWN, message);
        }


    }

删除文件

public void remove(String url) {
        //从minio服务上删除
        try {
             创建 HttpClient 实例
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            log.debug("接受删除图片业务请求路径为:{}", url);

            //url截取去掉包括?部分地址
            String[] parts = url.split("\\?");
            log.debug(parts[0]);

            // 创建 HttpDelete 请求
            HttpDelete httpDelete = new HttpDelete(parts[0]);

            // 执行请求并获取响应
            HttpResponse response = httpClient.execute(httpDelete);

            // 获取响应状态码
            int responseCode = response.getStatusLine().getStatusCode();

            // 判断响应状态码是否为 200 或 204
            if (responseCode == 200 || responseCode == 204) {
                log.debug("图片删除成功");

            } else {
                log.debug("图片删除失败");
                String message = "图片删除失败";
                throw new ServiceException(ServiceCode.ERROR_UNKNOWN, message);
            }

            httpClient.close();
        } catch (IOException e) {
            log.debug("文件删除异常,请重试");
            String message = "文件删除异常,请重试";
            throw new ServiceException(ServiceCode.ERROR_UNKNOWN, message);
        }


    }

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值