MinIO文件存储

文件存储


对象存储特点

1,简介

对象存储是由AWS首先推出的一个存储产品形态,AWS的S3协议也成为对象存储事实标准,各个云存储厂商的云存储服务协议都兼容S3。从国内外这四个公有云厂商对象存储的描述,我们就能看出对象存储的几个特点:

  1. 海量存储: 一般块存储来说(公有云形态为云盘)体量如果能达到PB级别;但是对象存储的体量,PB就不够看了,至少都是EB的支持。国内公有云的对象存储体量基本上EB级别体量。
  2. 易扩展,低成本:对象存储产品还可以细分成标准存储,归档存储,低频存储等。不同的产品适用于不同的场景,那么就允许使用特定的软硬件方案来限定成本。

阿里云

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。
OSS

七牛云

七牛云海量存储系统(KODO)是自主研发的非结构化数据存储管理平台,支持中心和边缘存储。平台经过多年大规模用户验证已跻身先进技术行列,并广泛应用于海量数据管理的各类场景。
KODO

腾讯云

对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。
COS

AWS S3

Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用它来存储和保护各种用例(如网站、移动应用程序、备份和还原、存档、企业应用程序、IoT 设备和大数据分析)的任意数量的数据。
AWS

2、对象存储使用场景

对象存储的事实协议标准是S3,是基于http之上的应用协议;对象存储对外只提供两个抽象概念:桶,对象。

  • 基本上互联网的产品服务都使用了对象存储;
    • 海量短视频:比如抖音,快手的音视频数据就非常适用于对象存储
    • 静态网站,图床等
  • 大数据,AI数据这些数据也非常适合对象存储
  • 监控视频,海量日志,等归档数据,流式数据
  • 国内公有云厂商一般还会添加附加价值,比如多媒体数据处理

3、MinIO简介

MinIO 是一款基于Go语言的高性能对象存储服务。它采用了Apache License v2.0开源协议,兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

4、安装:微软Windows系统

下载二进制文件
操作系统 CPU架构 地址
微软Windows系统 64位 https://dl.min.io/server/minio/release/windows-amd64/minio.exe
minio.exe server D:\Photos
Docker 容器

稳定版

Copydocker pull minio/minio
docker run -p 9000:9000 minio/minio server /data
GNU/Linux

下载二进制文件

操作系统 CPU架构 地址
GNU/Linux 64-bit Intel https://dl.min.io/server/minio/release/linux-amd64/minio
Copychmod +x minio./minio server /data

使用MinIO浏览器进行验证

安装后使用浏览器访问http://127.0.0.1:9000,如果可以访问,则表示minio已经安装成功。

5、开发文件系统微服务

  • 导入依赖
<dependency>
    <groupId>io.miniogroupId>
    <artifactId>minioartifactId>
    <version>3.0.10version>
dependency>
  • 在SpringBoot中开启文件上传功能,需要在application.yml添加如下配置:
spring:
  servlet:
    multipart:
      enabled: true #开启文件上传
      max-file-size: 10MB #限制文件上传大小为10M
  • 在application.yml中对MinIO客户端进行配置:
# MinIO对象存储相关配置
minio:
  endpoint: http://localhost:9000 #MinIO服务所在地址
  bucketName: mall #存储桶名称
  accessKey: minioadmin #访问的key
  secretKey: minioadmin #访问的秘钥
  • 创建MinioController控制器用于实现文件的上传和删除操作:
@Api(tags = "MinioController", description = "MinIO对象存储管理")
@RestController
@RequestMapping("/minio")
@Slf4j
public class MinioController {
    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @ApiOperation("文件上传")
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public CommonResult upload(@RequestParam("file") MultipartFile file) {
        try {
            //创建一个MinIO的Java客户端
            MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
            boolean isExist = minioClient.bucketExists(bucketName);
            if (!isExist) {
                //创建存储桶并设置只读权限
                minioClient.makeBucket(bucketName);
                minioClient.setBucketPolicy(bucketName, "*.*", PolicyType.READ_ONLY);
            }
            String filename = file.getOriginalFilename();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            // 设置存储对象名称
            String objectName = sdf.format(new Date()) + "/" + filename;
            // 使用putObject上传一个文件到存储桶中
            minioClient.putObject(bucketName, objectName, file.getInputStream(), file.getContentType());
            log.info("文件上传成功!");
            MinioUploadDto minioUploadDto = new MinioUploadDto();
            minioUploadDto.setName(filename);
            minioUploadDto.setUrl(endpoint + "/" + bucketName + "/" + objectName);
            return CommonResult.success(minioUploadDto);
        } catch (Exception e) {
            log.info("上传发生错误: {}!", e.getMessage());
        }
        return CommonResult.failed("文件上传失败");
    }
    @ApiOperation("文件删除")
    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    public CommonResult delete(@RequestParam("objectName") String objectName) {
        try {
            MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
            minioClient.removeObject(bucketName, objectName);
            return CommonResult.success(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return CommonResult.failed("文件删除失败");
    }
}
  • 启动SpringBoot应用,使用Postman来访问上传接口进行文件上传

  • 上传完成后,我们打开MinIO的管理界面可以看到上传后的图片,也可以通过返回的url来访问图片:

  • 调用删除接口来删除该图片,需要注意的是objectName值是存储桶中的图片相对路径,删除文件接口地址:http://localhost:8080/minio/delete

你可能感兴趣的:(后端,java)