赞
踩
一、应用场景:海量非结构化数据存储需求。例如文件、图片、音频、视频等。
二、简介:MinIO是一个基于Apache License V2.0开源协议的对象存储服务。
三、基础概念:
Object: 存储到MinIO的基本对象,如文件、字节流...
Bucket: 用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。
Drive: 部署MinIO时设置的磁盘,MinIO中所有的对象数据都会存储到Drive。
Set: 一组Drive的集合,MinIO会自动根据Drive数量,将若干个Drive划分为多个Set(For example: {1...64} is divided into 4 sets each of size 16)。
四、MinIO安装与启动:
单机部署
(1)非纠删码模式部署:此模式下,对于每一份对象数据,minIO直接在data下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是”单点“,无任何高可用保障,磁盘损坏就表示数据丢失。
(2)纠删码模式部署:此模式为MinIO server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server 会自动启用纠删码模式。纠删码对磁盘的个数是有要求的,如不满足要求,实例启动失败。
单机版安装启动步骤:
第一步:下载MinIO软件,并添加执行权限chmod +x minio
第二步:修改账号、密码
export MINIO_ROOT_USER=minioadmin(自行设置)
export MINIO_ROOT_PASSWORD=minioadmin(自行设置)
第三步:启动 /home/data是自己定义的文件路径,进入MinIO的安装目录执行./minio server /home/data
静默启动
nohup ./minio server /home/data >/home/data/minio.log 2>&1 &
静默启动 并 设置端口
nohup ./minio server --address 0.0.0.0:80 /home/data >/home/data/minio.log 2>&1 &
第四步:登录访问http://192.168.149.129:9000
第五步:创建桶并编辑策略,Bucket Policy策略管理
用于添加,删除,列出策略,获取有关策略的信息并为MinIO服务器上的用户设置策略。
五、Spring Boot整合MinIO
引入MinIO依赖
<!--MinIO-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.3</version>
</dependency>
application.yml配置文件
minio:
endpoint: http://192.168.149.*:9000
accessKey: minioadmin
secretKey: minioadmin
bucketName: myfirstbucket
配置类MinIOConfig
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig{
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
/**
* 注入minio 客户端
* @return MinioClient
*/
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
5.1.文件上传
@Resource
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
/**
* 文件上传
* @param file
* @return ResponseData
*/
@PostMapping("/upload")
public ResponseData upload(@RequestParam(name = "file") MultipartFile[] file){
if(file == null || file.length ==0){
return ResponseData.error("上传文件不能为空");
}
//防御性编程,批量限制少于10个
if(file.length > Constant.NumberInt.FILE_UPLOAD_LIMIT_NUM){
return ResponseData.error("请上传少于" + file.length + "个文件");
}
try {
List<String> urlList = new ArrayList<>(file.length);
for (MultipartFile multipartFile : file){
InputStream in = multipartFile.getInputStream();
// minioClient.statObject(StatObjectArgs.builder().object(file.getOriginalFilename()).bucket(bucketName).build());
minioClient.putObject(PutObjectArgs.builder().object(multipartFile.getOriginalFilename())
.bucket(bucketName)
.contentType(multipartFile.getContentType())
.stream(in, multipartFile.getSize(),-1).build());
in.close();
String str = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket(bucketName)
.object(multipartFile.getOriginalFilename())
.method(Method.POST)
.build());
String urlStr = StringUtils.substringBefore(str, "?");
urlList.add(urlStr);
}
Map<String, Object> map = new HashMap<>();
map.put("urlList", urlList);
return ResponseData.success(map.get("urlList"));
} catch (Exception e) {
return ResponseData.error("上传失败:" + e.getMessage());
}
}
5.2.文件下载
/**
* 下载文件
* @param filename
* @param response
*/
@GetMapping("/download/{filename}")
public void download(@PathVariable String filename, HttpServletResponse response){
InputStream in = null;
try {
//获取对象信息
StatObjectResponse stat = minioClient.statObject(
StatObjectArgs.builder().bucket(bucketName).object(filename).build());
response.setContentType(stat.contentType());
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
//文件下载
in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filename).build());
IOUtils.copy(in, response.getOutputStream());
}catch (Exception e){
e.getMessage();
}finally {
if(in != null){
try {
in.close();
}catch (IOException e){
e.getMessage();
}
}
}
}
5.3.文件删除
/**
* 删除文件
* @param filename
* @return ResponseData
*/
@DeleteMapping("/delete/{filename}")
public ResponseData delete(@PathVariable("fileName") String filename){
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName)
.object(filename).build());
}catch (Exception e){
e.getMessage();
return ResponseData.error("删除失败");
}
return ResponseData.success("删除成功");
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39673648/article/details/122183059
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。