本文介绍了如何使用MinIO构建分布式文件服务,并与Spring Boot进行整合实现文件上传功能。MinIO是一款基于Go语言开发的高性能开源对象存储服务,兼容亚马逊S3接口,适用于多种应用场景,包括私有云存储和作为云存储网关。其主要特点包括高性能(读写速率可达55Gb/s和35Gb/s)、支持大文件存储(最大5T)、可扩展性、云原生支持、图形化界面、纠删码数据保护等。
安装MinIO
-
使用Docker安装,包括获取镜像和启动容器:
- 命令:
docker pull minio/minio - 启动命令:
docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data - 参数解释:9000为图形界面端口,9001为API端口;
MINIO_ACCESS_KEY和MINIO_SECRET_KEY分别为图形界面用户名和密码,且MINIO_ACCESS_KEY必须大于等于3位,MINIO_SECRET_KEY必须大于等于8位。
- 命令:
-
图形界面操作:访问
http://<ip>:9000/login,登录后可在Buckets菜单创建桶并设置隐私规则。
Spring Boot整合MinIO
-
获取
accessKey和secretKey:在MinIO图形界面中获取,不同于登录用户名和密码。 -
添加依赖:
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.2</version> </dependency> -
配置
application.yml:minio: # 访问的url endpoint: <http://localhost> # API的端口 port: 9001 accessKey: ZTJ11ewfzAlFYV2RLTYD secretKey: O82Y1D3L2FdusRi1gkoRKljep6KhRbvM0iVepghj bucket: filedemo secure: false -
创建上传文件接口:
public String uploadFile(MultipartFile file) throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { String fileName = file.getOriginalFilename(); minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(file.getInputStream(), file.getSize(), -1) .build() ); // 保存文件信息到数据库 FileInfo fileInfo = new FileInfo(); fileInfo.setFileName(fileName); fileInfo.setFileUrl(String.format("%s:%d/%s/%s", endpoint, port, bucketName, fileName)); fileInfo.setFileSize(file.getSize()); fileInfo.setContentType(file.getContentType()); fileInfo.setUploadTime(LocalDateTime.now()); fileInfoRepository.save(fileInfo); return fileInfo.getFileUrl(); } -
测试:调用接口上传文件,返回的URL可直接访问文件。MinIO中也可查看存储的文件,并支持临时分享,有效期7天。
MinIO作为开源项目功能强大,适合小型项目实现对象存储或搭建免费图床。