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 部署mysql突然连接不上的问题及解决方法

    使用docker 部署mysql突然连接不上的问题及解决方法

    这篇文章主要介绍了使用docker 部署mysql,突然连接不上,要解决这个问题需要找到根本原因,对症治疗就好,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Docker安装MySQL8的方法步骤

    Docker安装MySQL8的方法步骤

    本篇文章主要介绍了Docker安装MySQL8的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 详解Docker中安装配置Oracle数据库

    详解Docker中安装配置Oracle数据库

    本篇文章主要介绍了详解Docker中安装配置Oracle数据库,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • IDEA使用Docker插件(菜鸟教程)

    IDEA使用Docker插件(菜鸟教程)

    本文主要介绍了IDEA使用Docker插件,文中通过图文示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 详解在Docker容器中运行Spring Boot应用

    详解在Docker容器中运行Spring Boot应用

    本文将以一个最简单的Spring Boot开发的Web应用为例,讲解如何将其容器化运行。本文的重点是构建Docker镜像、运行Docker容器。
    2017-06-06
  • docker pull很慢如何解决

    docker pull很慢如何解决

    这篇文章主要介绍了docker pull很慢的解决方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Docker之容器导出为镜像问题

    Docker之容器导出为镜像问题

    这篇文章主要介绍了Docker之容器导出为镜像问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 手工制作docker镜像-包含多个服务ssh+nginx

    手工制作docker镜像-包含多个服务ssh+nginx

    这篇文章主要介绍了手工制作docker镜像-包含多个服务ssh+nginx,需要的朋友可以参考下
    2024-07-07
  • Docker 常用命令整理及使用注意事项总结

    Docker 常用命令整理及使用注意事项总结

    这篇文章主要介绍了Docker 常用命令整理及使用注意事项总结的相关资料,这里整理了Docker 的常用命令,说明这些命令是什么意思及使用方法,需要的朋友可以参考下
    2016-12-12
  • 解决Docker之mysql容器数据库更改不生效的问题

    解决Docker之mysql容器数据库更改不生效的问题

    这篇文章主要介绍了解决Docker之mysql容器数据库更改不生效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论