什么是对象存储?
是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务
有什么用?
对象存储是一种数据存储模型,它将数据视为对象,每个对象都包含数据本身以及与之相关的元数据。对象存储通常用于存储大量非结构化数据,如图像、音频、视频、文档等。它与传统的文件系统存储方式不同,不需要文件夹层级结构,而是通过唯一的标识符来访问每个对象。
简单来说就是存储文件,不需要存储在本地;比如说图床,可以直接访问。
用法:
1.导入依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
2.上传使用
1.可以直接上自带的9000端口访问界面
账号默认 minio 密码默认是password
自己创建一个bucket用于存储
一个bucket就像是一个文件夹 ,
可以自己上传自己想要的文件
2.通过调用api上传
1.首先是配置类
public class MinioConfiguration {
@Value("${spring.minio.endpoint}")
String endpoint;
@Value("${spring.minio.username}")
String username;
@Value("${spring.minio.password}")
String password;
@Bean
public MinioClient minioClient(){
log.info("MinioInit");
return MinioClient.builder()
.endpoint(endpoint)
.credentials(username, password)
.build();
}
}
2.实现
@Override
public String uploadAvatar(MultipartFile file, int id) throws IOException {
String imagename = UUID.randomUUID().toString().replace("-","");
String imageName = "/avatar/"+imagename ;
PutObjectArgs args =
PutObjectArgs.builder()
.bucket("imchat")
.stream(file.getInputStream(), file.getSize(), -1)
.object(imageName)
.build();
try {
minioClient.putObject(args);
String avatar = accountDetailService.getById(id).getAccountAvatar();
this.DeleteOldAvatar(avatar);
if(accountDetailService.update(null,
Wrappers.<AccountDetails>update().eq("account_id",id).set("account_avatar",imagename))){
return imageName;
}else{
return null;
}
}catch (Exception e){
return RestBean.error(ImageError.UPLOAD_IMAGE_ERROR.getCode(), ImageError.UPLOAD_IMAGE_ERROR.getError()).ToJSON();
}
}
路径名称一定要正确
这里有我自己业务的参数可以忽略不看
3.获取使用
@Override
public void fetchImageAvatar(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String imagePath = request.getServletPath().substring(8);
ServletOutputStream stream = response.getOutputStream();
if(imagePath.length() <= 13) {
response.setStatus(404);
stream.println(RestBean.error(SystemError.NOT_FIND.getCode(), SystemError.NOT_FIND.getError()).toString());
} else {
try {
this.fetchImageFromMinio(stream, imagePath);
response.setHeader("Cache-Control", "max-age=2592000");
response.setHeader("Content-Type","image/jpg");
} catch (ErrorResponseException e) {
if(e.response().code() == 404) {
response.setStatus(404);
stream.println(RestBean.error(SystemError.NOT_FIND.getCode(), SystemError.NOT_FIND.getError()).toString());
} else {
log.error("从Minio获取图片出现异常: "+e.getMessage(), e);
}
}
}
}
public void fetchImageFromMinio(OutputStream stream,
String image) throws Exception {
GetObjectArgs args = GetObjectArgs.builder()
.bucket("imchat")
.object("/avatar/"+image)
.build();
GetObjectResponse response = minioClient.getObject(args);
IOUtils.copy(response, stream);
}
@GetMapping("/images/**")
public void imageFetch(HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.setHeader("Content-Type", "image/jpg");
imageService.fetchImageAvatar(request, response);
}
大致的流程就是 将图片的名字用uuid的形式存入到minio中,uuid存入到数据库中,当需要调用的时候,查找数据的uuid,通过url 提供路径查找
效果就是这样
记得springsecurity去放行的接口