MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由选择底层存储介质。它基于Apache License 开源协议,兼容Amazon S3云存储接口。适合存储非结构化数据,如图片,音频,视频,日志等。
官网:MinIO | 用于AI的S3 & Kubernetes原生对象存储
目录
Linux安装minio
这里使用docker部署
1.拉取镜像
docker pull quay.io/minio/minio
2.创建容器
docker run \
-p 9000:9000 \
-p 9090:9090 \
--name minio \
-v /mydata/data:/data \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=wsgxgxsw10" \
-d \
quay.io/minio/minio server /mydata/minio/data --console-address ":9090"
其中9090是客户端端口,9000是服务单端口,通过9090端口访问minio客户端,通过9000端口调用minio的API。
挂载的数据卷就是存放我们上传到minio上的文件。
注意,用户名的长度至少为3,密码的长度至少为8,不然容器会启动不了,使用docker logs minio(容器名称) 查看日志会报如下错误
Unable to validate credentials inherited from the shell environment: Invalid credentials
> Please provide correct credentials
HINT:
Access key length should be at least 3, and secret key length at least 8 characters
然后访问9090端口,输入用户名和密码就可以登录minio的客户端
Window安装minio
1.下载MinIO。
访问 minio官方网站,选择适合Windows系统的64位版本进行下载。
2.准备存储文件夹。
在下载路径下,创建一个名为minioData的文件夹,用于存储MinIO上传的文件。
3.启动MinIO。
在命令提示符中,使用minio.exe文件启动MinIO服务器,命令格式为minio.exe server 存储文件夹路径,例如,如果将MinIO安装在D盘,则命令为minio.exe server D:\minioData。
4.访问MinIO控制台。
在浏览器中输入http://localhost:9000,这通常是MinIO的默认访问地址。使用默认的用户名和密码(均为minioadmin)登录。(为什么下面图片上端口不是9000?我也不太清楚,反正我输入的是localhost:9000,他自动就转到这个地址了)
完成这些步骤后,就可以在windows上使用MinIO进行文件存储和管理了。
后台代码实现上传文件到minio
先在minio中新建一个桶(也可以在代码中实现)
第一步,导入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.3</version>
</dependency>
第二步,在配置文件中配置信息
minio:
username: xxxx
password: xxxx
bucket: xxxx
url: http://xxxxx:9000
第三步,编写工具类实现文件上传功能
@Component
@Slf4j
public class FileUploader {
@Value("${minio.username}")
private String username;
@Value("${minio.password}")
private String password;
@Value("${minio.bucket}")
private String bucketName;
@Value("${minio.url}")
private String url;
/**
* 上传文件
* @param file
*/
public String saveFile(MultipartFile file) {
MinioClient minioClient =
MinioClient.builder()
.endpoint(url)
.credentials(username, password)
.build();
try {
//判断桶是否存在
boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!bucketExists){
//如果不存在,就创建桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
//本地时间,具体到年、月、日
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//加一个/表示创建一个文件夹
String filename = time+"/"+file.getOriginalFilename();
//上传
minioClient.putObject(PutObjectArgs.builder().
bucket(bucketName).
object(filename).
stream(file.getInputStream(), file.getSize(), -1).
contentType(file.getContentType()).
build());
//获取地址
String resurl = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(filename)
.expiry(60 * 60) // URL 的有效期(秒)
.build()
);
log.info("文件上传成功,地址:{}",resurl);
//返回地址
return resurl;
} catch (Exception e) {
log.info("文件上传失败");
e.printStackTrace();
}
return null;
}
}
第四步,调用上面的文件上传方法即可
@Resource
private FileUploader fileUploader;
@PostMapping("/test/upload")
public Result testupload(MultipartFile file){
String s = fileUploader.saveFile(file);
return new Result(0,"文件上传成功","url:"+s);
}
第五步,进行测试
到这里,使用minio进行文件管理就实现了。