首页 > 其他分享 >对象存储服务MinIO-快速入门-集成项目

对象存储服务MinIO-快速入门-集成项目

时间:2024-10-23 11:19:42浏览次数:11  
标签:文件 存储 String 入门 private MinIO file public minio

对象存储服务MinIO

MinIO简介

MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。

MinIO特点

  • 数据保护

    Minio使用Minio Erasure Code(纠删码)来防止硬件故障。即便损坏一半以上的driver,但是仍然可以从中恢复。

  • 高性能

    作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率

  • 可扩容

    不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心

  • SDK支持

    基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持

  • 有操作页面

    面向用户友好的简单操作界面,非常方便的管理Bucket及里面的文件资源

  • 功能简单

    这一设计原则让MinIO不容易出错、更快启动

  • 丰富的API

    支持文件资源的分享连接及分享链接的过期策略、存储桶操作、文件列表访问及文件上传下载的基本功能等。

  • 文件变化主动通知

    存储桶(Bucket)如果发生改变,比如上传对象和删除对象,可以使用存储桶事件通知机制进行监控,并通过以下方式发布出去:AMQP、MQTT、Elasticsearch、Redis、NATS、MySQL、Kafka、Webhooks等。

一、安装启动

我采用的是docker安装

docker pull minio/minio

创建配置文件目录和上传目录

mkdir -p /home/minio/config
mkdir -p /home/minio/data

启动容器

docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=admin" \
     -e "MINIO_SECRET_KEY=admin123456" \
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"

假设我们的服务器地址为http://192.168.200.100:9000,我们在地址栏输入:http://http://192.168.200.100:9000/ 即可进入登录界面。
在这里插入图片描述

Access Key为admin ,Secret_key 为admin123456进入系统后可以看到主界面
在这里插入图片描述

一、快速入门

创建springboot项目

1 导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>7.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

在配置文件中导入

minio:
  accessKey: admin
  secretKey: admin123456
  bucket: text
  endpoint: http://192.168.200.100:9000
  readPath: http://192.168.200.100:9000

2 配置类

MinIOProperties

@Configuration
@Data
@ConfigurationProperties(prefix = "minio")
public class MinIOProperties {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

MinIOClientConfig

@Data
@Primary
@Configuration
public class MinIOClientConfig {

   @Autowired
   private MinIOProperties minIOProperties;

    @Bean
    public MinioClient buildMinioClient(){
        return MinioClient
                .builder()
                .credentials(minIOProperties.getAccessKey(), minIOProperties.getSecretKey())
                .endpoint(minIOProperties.getEndpoint())
                .build();
    }
}

3 开始业务

Controller

@RestController
@RequestMapping("minio")
public class UploadController {
    @Autowired
    private FileService fileService;


    @PostMapping("/upload")
    public String uploadMinio(@RequestPart("file") MultipartFile file) {
        return fileService.uploadMinio(file);
    }

}

Service

public interface FileService {
    public String uploadMinio(MultipartFile file) ;
}

ServiceImpl

@Slf4j
@Service
public class FileServiceImpl implements FileService {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinIOProperties minioProperties;

    @Override
    public String uploadMinio(MultipartFile file) {
        System.out.println(minioProperties);
        try {
            // 判断桶是否存在
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucket()).build());
            if (!found) {       // 如果不存在,那么此时就创建一个新的桶
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucket()).build());
            } else {  // 如果存在打印信息
                System.out.println("Bucket 'daijia' already exists.");
            }

            // 设置存储对象名称
            String extFileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            String fileName = new SimpleDateFormat("yyyyMMdd")
                    .format(new Date()) + "/" + UUID.randomUUID().toString().replace("-" , "") + "." + extFileName;

            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(minioProperties.getBucket())
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .object(fileName)
                    .build();
            minioClient.putObject(putObjectArgs) ;

            return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + fileName ;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "error";
    }
}

4 测试

在这里插入图片描述

点击连接,就可以开始下载图片

如果发现图片报错,去控制台把Access Policy 改成Pubilc

在这里插入图片描述

完成。

不用web的方式也可以上传图片:

Service

public interface FileStorageService {


    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    public String uploadImgFile(String prefix, String filename,InputStream inputStream);
    
  	/**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    public void delete(String pathUrl);

}

  

ServiceImpl


@Slf4j
@Service
public class MinIOFileStorageServiceImpl implements FileStorageService {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinIOProperties minIOConfigProperties;

    private final static String separator = "/";

    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    @Override
    public String uploadImgFile(String prefix, String filename, InputStream inputStream) {
        String filePath = builderFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(filePath)
                    .contentType("image/jpg")
                    .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
            urlPath.append(separator+minIOConfigProperties.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        }catch (Exception ex){
            log.error("minio put file error.",ex);
            throw new RuntimeException("上传文件失败");
        }
    }



    /**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    @Override
    public void delete(String pathUrl) {
        String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
        int index = key.indexOf(separator);
        String bucket = key.substring(0,index);
        String filePath = key.substring(index+1);
        // 删除Objects
        RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
        try {
            minioClient.removeObject(removeObjectArgs);
        } catch (Exception e) {
            log.error("minio remove file error.  pathUrl:{}",pathUrl);
            e.printStackTrace();
        }
    }
}

测试类:

@SpringBootTest
class MinioDemoApplicationTests {
    @Autowired
   private MinIOFileStorageServiceImpl minIOFileStorageServiceImpl;

    @Test
    void imageFileStorage() throws IOException {
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");
        String path = minIOFileStorageServiceImpl.uploadImgFile("text", fileName, Files.newInputStream(new File("D:\\图片\\1.jpg").toPath()));
        System.out.println(path);
    }
    @Test
    void deleteImageFile() throws IOException {
        minIOFileStorageServiceImpl.delete("");//这里填上传的文件路径
    }

}

完成。

标签:文件,存储,String,入门,private,MinIO,file,public,minio
From: https://blog.csdn.net/2301_81717523/article/details/143090825

相关文章

  • SpringBoot-集成腾讯云对象存储Cos-快速入门
    腾讯云对象存储COS一准备工作1注册腾讯云首先注册与登录等腾讯云,官网地址:https://cloud.tencent.com/2开通腾讯云对象存储COS腾讯云对象存储COS:官网地址:https://cloud.tencent.com/product/cos3进入控制台创建存储桶填写信息第二页直接默认就好这里的请求......
  • SpringBoot-集成阿里云OSS对象存储
    阿里云OSS-对象存储一介绍阿里云对象存储OSS(ObjectStorageService),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。在我们使用了阿里云OSS对象存储服务之后,我们的项目当中如果涉及......
  • 6个黑客教程网站,小白也能成大牛!(非常详细)零基础入门到精通,收藏这一篇就够了
    黑客攻击是一项很难掌握的技能,在很大的程度上要求人们对计算机和软件架构的各种概念和网络系统有深入的了解。一般而言,黑客主要有两种:黑帽黑客、白帽黑客。黑帽黑客为了个人利益,利用自身的计算机系统知识侵入系统,这种做法是违法的,需要负法律责任;而白帽黑客则是利用相同的......
  • perl语言入门
    数据类型数字1.25#小数4.5e10#科学计数法255#整数64_4#可以加下划线,等同于6440377#八进制的3770xff#十六进制的ff0b11111111#二进制的11111111字符串单引号双引号都可以使用。单引号类似于原意字符串,如果需要用到转义符或者单引号需要在前面加\,\表示转义符,'表......
  • ZooKeeper 入门教程
    0.前言文章已经收录到GitHub个人博客项目,欢迎Star:https://github.com/chenyl8848/chenyl8848.github.io或者访问网站,进行在线浏览:https://chenyl8848.github.io/1.ZooKeeper简介ZooKeeper(动物园管理者)简称ZK,一个分布式的,开放源码的分布式应用程序协调服务,是Googl......
  • 计算机组成原理之虚拟存储器
    定义:虚拟存储器是主存的扩展,由主存和辅存共同构成,在硬件和系统软件的共同管理下工作。特点:对应用程序员透明。具有主存的速度和辅存的容量。将主存和辅存的地址空间统一编址,形成一个庞大的地址空间,用户可以在此基础上自由编程,而不必关心物理地址、主存容量等问题。地......
  • C++入门Day5 ~ 6:简单变量 & 数据类型 part 1 <8000字长文带你初步理解数据类型>
    这是我在学习中的一个小问题,希望对你也有所帮助:        问:数据类型和简单变量属于oop的基本概念吗?        答:不是!数据类型和简单变量本身并不属于面向对象编程(OOP)的基本概念,但它们是编程中的基础概念,面向对象编程会基于这些基础概念来构建更复杂的结构。......
  • 2024版最新大模型场景应用汇总(持续更新)零基础入门到精通,收藏这篇就够了
    一、应用场景1.办公场景智能办公:文案生成(协助构建大纲+优化表达+内容生成)、PPT美化(自动排版+演讲备注+生成PPT)、数据分析(生成公式+数据处理+表格生成)。智能会议:会议策划(生成会议环节+会议分论坛+会议时间+会议预算)、同声传译(实时的多语言互译)、会议记录(生成结构清明+要......
  • 【头歌实训:邻接表存储图的广度优先遍历】
    头歌实训:邻接表存储图的广度优先遍历文章目录任务描述相关知识邻接表存储图图的遍历广度优先遍历过程:算法设计思路:编程要求测试说明输入格式:输出格式:样例输入:样例输出:源代码:任务描述相关知识邻接表存储图图的遍历广度优先遍历过程:算法设计思路:......
  • Redis的持久化存储和集群管理操作
    Redis的持久化存储和集群一、引言Redis是一个开源的内存数据结构存储系统,被广泛应用于缓存、消息队列、排行榜等场景。然而,由于数据存储在内存中,一旦服务器重启或出现故障,数据就会丢失。为了解决这个问题,Redis提供了两种持久化存储方式:RDB(RedisDatabase)和AOF(AppendOnly......