一.环境准备
MinIO Object Storage for Windows — MinIO Object Storage for Windows
访问官网下载对应的操作系统的MinIO服务器
- 已windows系统为例
https://dl.min.io/server/minio/release/windows-amd64/minio.exe
下载对应的minio.exe文件
.\minio.exe server C:\minio --console-address :9090
输入以上命令启动本地minio实例,注:需要先进入minio.exe的根路径在输入以上命令,c:\minio最好替换为e:\minio,因为本项目是建立了一个本地存储服务器,所以以后上传的文件都会存储在本地,c:\minio就是文件存储的目录
在浏览器上输入启动框中的http地址,输入RootUser和RootPass,登陆后创建一个存储桶--类似于文件夹
二.什么是minio服务器
Minio服务器是一个开源的对象存储服务器,它兼容Amazon S3云存储服务的API。Minio服务器可以在本地或私有云环境中部署,提供可扩展的、高性能的对象存储解决方案。
Minio服务器的主要特点包括:
-
对象存储:Minio服务器可以存储各种类型的对象,如图片、视频、文档等。
-
分布式架构:Minio服务器支持分布式部署,可以通过添加多个服务器节点来实现数据的冗余备份和负载均衡。
-
高可用性:Minio服务器提供了数据冗余和自动故障转移机制,确保数据的可靠性和高可用性。
-
基于HTTP的API:Minio服务器使用HTTP协议提供API接口,可以通过简单的HTTP请求来上传、下载、删除和管理存储的对象。
-
安全性:Minio服务器支持多种安全机制,如访问控制列表(ACL)、加密传输(HTTPS)和身份验证(Access Key和Secret Key)等,以保护存储的数据安全。
-
可扩展性:Minio服务器可以根据需求进行水平扩展,通过添加更多的服务器节点来提高存储容量和性能。
Minio服务器的开源性质使得它成为了一个受欢迎的对象存储解决方案,适用于各种场景,包括数据备份、云原生应用、大数据分析等。
三.SpringBoot代码实现
- 导入依赖
<!-- Minio --> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.1.0</version> </dependency>
<!-- HttpClient用来发送http请求和接受响应--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency>
- 文件配置
# Minio配置 minio: endpoint: accessKey: secretKey:
minio启动成功后:
Console中的http地址是访问地址endpoint:需要输入的内容
RootUser中的minioadmin是访问密钥accessKey:中需要输入的内容
RootPass中的minioadmin是访问密钥的密钥secretKey:中需要输入的内容
- 代码实现
代码上传
public String upload(MultipartFile file) throws IOException {
String fileName = UUID.randomUUID().toString() + "-" + file.getOriginalFilename();
Method method = Method.GET;
// 上传文件到Minio服务器
try {
minioClient.putObject(
PutObjectArgs.builder()
//创建的存储桶
.bucket("files")
.object(fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build()
);
String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket("files")
.object(fileName)
.method(method)
.build());
log.debug("服务器返回url地址{}", url);
return url;
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
InvalidResponseException | NoSuchAlgorithmException | XmlParserException | ServerException e) {
String message = "连接minio服务器异常,请联系管理员!";
throw new ServiceException(ServiceCode.ERROR_UNKNOWN, message);
}
}
删除文件
public void remove(String url) {
//从minio服务上删除
try {
创建 HttpClient 实例
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
log.debug("接受删除图片业务请求路径为:{}", url);
//url截取去掉包括?部分地址
String[] parts = url.split("\\?");
log.debug(parts[0]);
// 创建 HttpDelete 请求
HttpDelete httpDelete = new HttpDelete(parts[0]);
// 执行请求并获取响应
HttpResponse response = httpClient.execute(httpDelete);
// 获取响应状态码
int responseCode = response.getStatusLine().getStatusCode();
// 判断响应状态码是否为 200 或 204
if (responseCode == 200 || responseCode == 204) {
log.debug("图片删除成功");
} else {
log.debug("图片删除失败");
String message = "图片删除失败";
throw new ServiceException(ServiceCode.ERROR_UNKNOWN, message);
}
httpClient.close();
} catch (IOException e) {
log.debug("文件删除异常,请重试");
String message = "文件删除异常,请重试";
throw new ServiceException(ServiceCode.ERROR_UNKNOWN, message);
}
}