简介
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:9000accessKey: minioadminsecretKey: minioadminbucket: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);}// 上传文件到MinIOString 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就可以直接访问到图片或者是视频等文件资源了:
访问到图片了