Docker安装Minio+SpringBoot上传下载文件方式

 更新时间:2024年10月31日 14:49:59   作者:Xiao_zuo_ya  
本文主要介绍了如何通过Docker安装Minio并进行访问测试,同时也讲解了如何在SpringBoot中上传文件到Minio,内容包含了pom文件引入依赖,application.properties配置,Minio配置,MinioClinet,FileService,FileServiceImpl的配置

Docker安装Minio

docker pull minio/minio
docker images
REPOSITORY    TAG       IMAGE ID       CREATED      SIZE
minio/minio   latest    162489e21d26   7 days ago   165MB
nginx         latest    7f553e8bbc89   7 days ago   192MB
# 外挂磁盘存储使用
mkdir -p /usr/local/minio/data
# 外挂配置文件使用
mkdir -p /usr/local/minio/config
# 创建minio 容器
docker run -d   --name minio   -p 9000:9000   -p 9001:9001   -v /usr/local/minio/data:/data   -v /usr/local/minio/config:/root/.minio   -e MINIO_ROOT_USER=admin   -e MINIO_ROOT_PASSWO
RD=admin   minio/minio server /data --console-address ":9001"
# 创建失败
docker logs minio
FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials
      > Please provide correct credentials
      HINT:
        MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters
# 密码不能少于8个字符
docker rm minio
docker run -d   --name minio   -p 9000:9000   -p 9001:9001   -v /usr/local/minio/data:/data   -v /usr/local/minio/config:/root/.minio   -e MINIO_ROOT_USER=admin   -e MINIO_ROOT_PASSWO
RD=admin123   minio/minio server /data --console-address ":9001"
# 防火墙开放端口
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanent
# 重启防火墙
sudo firewall-cmd --reload

访问测试

http://ip:9001

SpringBoot上传文件到Minio

pom文件引入依赖

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

application.properties配置Minio

spring.minio.access-key=pNehtjUDw9ENBlULVTGT
spring.minio.secret-key=p3yVngZ2Ei1uCtn6vKozrof6ICB7GFBiYPr5RAWW
spring.minio.endpoint=http://192.168.10.227:9000

配置MinioClinet

@Data
@Configuration
@ConfigurationProperties(prefix = "spring.minio")
@Slf4j
public class MinioConfig {

    private String accessKey;
    private String secretKey;
    private String endpoint;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                  .endpoint(endpoint)
                  .credentials(accessKey, secretKey)
                  .build();
    }
}

FileService

public interface FileService {

    /**
     * 是否存在桶
     */
    Boolean bucketExists(String bucketName);

    /**
     * 创建桶
     */
    void makeBucket(String bucketName);

    /**
     * 删除桶
     */
    void removeBucket(String bucketName);

    /**
     * 获取当所有桶
     */
    List<Bucket> getAllBuckets();

    /**
     *  上传文件
     */
    String uploadFile(String bucketName, String prefix, MultipartFile file) throws Exception;

    /**
     * 文件预览
     */
    String preview(String bucketName, String prefix, String fileName) throws Exception;

    /**
     * 文件下载
     */
    void download(String bucketName, String prefix, String fileName, HttpServletResponse res);

    /**
     * 删除文件
     */
    Boolean removeFile(String bucketName, String prefix, String fileName);

    /**
     * 文件是否存在
     */
    boolean isFileExists(String bucketName, String prefix, String fileName) throws Exception;

    /**
     * 生成一个带到期时间、签名的URL,这个地址可以提供给没有登录的第三方共享访问或者上传对象,针对于Bucket为私有的情况
     */
    String getPresignedObjectUrl(String bucketName, String prefix, String fileName);
}

FileServiceImpl

package com.example.demo.service.impl;

import java.util.List;
import java.util.Objects;
import java.util.UUID;
import javax.servlet.http.HttpServletResponse;

import cn.hutool.core.io.file.FileNameUtil;
import com.example.demo.service.FileService;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author :王建
 * @since :2024-10-10 11:38
 */
@Service
@Slf4j
public class FileServiceImpl implements FileService {

    @Autowired
    private MinioClient minioClient;

    @Override
    public Boolean bucketExists(String bucketName) {
        try {
            return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Bucket> getAllBuckets() {
        try {
            return minioClient.listBuckets();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String uploadFile(String bucketName, String prefix, MultipartFile file) throws Exception {
        String uuid = UUID.randomUUID().toString();
        // 重新命名原来文件
        String fileName = uuid + "." + FileNameUtil.extName(file.getOriginalFilename());
        log.info("源文件名称:{},重命名后文件名称:{}", file.getOriginalFilename(), fileName);
        String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName;
        PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(objectName)
                .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
        minioClient.putObject(objectArgs);
        return uuid;
    }

    @Override
    public String preview(String bucketName, String prefix, String fileName) throws Exception {
        // 查看文件地址
        String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName;
        GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build();
        return minioClient.getPresignedObjectUrl(build);
    }

    @Override
    public void download(String bucketName, String prefix, String fileName, HttpServletResponse res) {

    }

    @Override
    public Boolean removeFile(String bucketName, String prefix, String fileName) {
        return null;
    }

    @Override
    public boolean isFileExists(String bucketName, String prefix, String fileName) throws Exception {
        String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName;
        StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
        return !Objects.isNull(statObjectResponse);
    }

    @Override
    public String getPresignedObjectUrl(String bucketName, String prefix, String fileName) {
        return null;
    }
}

配置Minio允许直接预览PDF文件

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker-compose up -d和docker-compose up --build的区别

    docker-compose up -d和docker-compose up -

    本文主要介绍了docker-compose up -d和docker-compose up --build的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • mysql8.x docker远程访问配置详解

    mysql8.x docker远程访问配置详解

    本文主要介绍了mysql8.x docker远程访问配置,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Docker搭建Minio容器的流程步骤(完整详细版)

    Docker搭建Minio容器的流程步骤(完整详细版)

    Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能,它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,本文将给大家介绍Docker搭建Minio容器的流程步骤,需要的朋友可以参考下
    2024-08-08
  • Docker安装node-red、导入节点、部署查看的步骤详解

    Docker安装node-red、导入节点、部署查看的步骤详解

    Node-RED设计使用的场景是IoT,但是作为一个流编排引擎,显然它能做的事情更多,比如使用容器化的方式进行构建、打包、部署等操作也是可行的,这篇文章继续介绍Docker安装node-red、导入节点、部署查看的相关知识,感兴趣的朋友一起看看吧
    2022-01-01
  • Docker 教程之镜像创建及修改详细介绍

    Docker 教程之镜像创建及修改详细介绍

    这篇文章主要介绍了Docker 教程之镜像创建及修改详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12
  • 使用docker搭建gitlab详解

    使用docker搭建gitlab详解

    本篇文章主要介绍了使用docker搭建gitlab详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Docker安装mysql超详细步骤记录

    Docker安装mysql超详细步骤记录

    mysql大家可能习惯是二进制安装的,现在容器化发展迅速,也有很多公司是用docker安装的,下面这篇文章主要给大家介绍了关于在Docker安装mysql的超详细步骤,需要的朋友可以参考下
    2022-07-07
  • docker 安装 zeppeline的操作

    docker 安装 zeppeline的操作

    Zeppelin是基于Jupyter Notebook技术开发的大数据交互分析服务软件。接下来通过本文给大家介绍docker 安装 zeppeline的相关知识,感兴趣的朋友一起看看吧
    2022-01-01
  • Docker Kill/Pause/Unpause命令使用与区别小结

    Docker Kill/Pause/Unpause命令使用与区别小结

    本文详细介绍了Docker中的三个重要命令,kill、pause和unpause,这些命令在管理和操作运行中的容器时非常有用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 快速掌握使用Docker搭建开发环境

    快速掌握使用Docker搭建开发环境

    利用Docker Compose技术辅助开发人员对于开发环境的搭建,最终实现开发人员只要装有Docker就可以完成整个开发环境的搭建。今天小编给大家分享使用Docker搭建开发环境的详细流程,感兴趣的朋友一起看看吧
    2021-05-05

最新评论