安装以及使用Minio分布式文件系统
简介
MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
它一大特点就是轻量,使用简单,功能强大,支持各种平台,单个文件最大5TB,兼容 Amazon S3接口,提供了 Java、Python、GO等多版本SDK支持。
官网:https://min.io
中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/
MinIO集群采用去中心化共享架构,每个结点是对等关系,通过Nginx可对MinIO进行负载均衡访问。
安装与运行
下载MinIO:访问MinIO的官方网站https://min.io/)并导航到下载页面。选择适用于您操作系统的MinIO二进制文件进行下载。
这里我下载的是windows版本的,然后执行:
minio.exe server F:\project\minIO\minio\minIoData
访问MinIO管理界面:在浏览器中访问 http://localhost:9000
,看到MinIO的管理界面,账号密码是minioadmin,同时创建你想要储存的文件的bucket。
设置为public
要改变accesskey的话:
输入bucket的名称,点击“CreateBucket”,创建成功
整合
在安装MinIO服务器后,可以使用Spring Boot来接收前端上传的图片,并将其保存到MinIO,然后获取图片的访问链接。以下是实例代码:
添加MinIO Java客户端依赖:在Spring Boot项目的构建文件(如pom.xml
)中,添加以下依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.3</version>
</dependency>
创建MinIO配置:在Spring Boot的配置文件中,添加MinIO服务器的端点和访问凭证配置:
minio:
endpoint: http://localhost:9000
accessKey: minioadmin
secretKey: minioadmin
bucket:
bucket1: picture #对应桶的名字
创建文件上传接口:创建一个Spring Boot的Controller类,定义文件上传的接口:
import io.minio.MinioClient;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@RestController
@RequestMapping("/api/files")
public class FileUploadController {
@Value("${minio.endpoint}")
private String minioEndpoint;
@Value("${minio.accessKey}")
private String minioAccessKey;
@Value("${minio.secretKey}")
private String minioSecretKey;
@Value("${minio.bucket.bucket1}")
private String bucket;
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 创建MinIO客户端
MinioClient minioClient = MinioClient.builder()
.endpoint(minioEndpoint)
.credentials(minioAccessKey, minioSecretKey)
.build();
// 检查存储桶是否存在,如果不存在则创建
String bucketName = bucket;
boolean isExist = minioClient.bucketExists(bucketName);
if (!isExist) {
minioClient.makeBucket(bucketName);
}
// 上传文件到MinIO
String objectName = file.getOriginalFilename();
minioClient.uploadObject(bucketName, objectName, file.getInputStream(), file.getSize(), file.getContentType());
// 获取文件的访问链接
String fileUrl = minioClient.getObjectUrl(bucketName, objectName);
return ResponseEntity.ok(fileUrl);
} catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
}
代码中,/api/files/upload
是文件上传接口的URL路径,它接收前端上传的文件,并将文件保存到MinIO服务器中。在接口的实现中,我们使用MinIO Java客户端来完成文件上传和获取文件访问链接的操作。
这样返回的fileUrl就可以直接访问到图片或者是视频等文件资源了:
访问到图片了