Bootstrap

Minio对象存储

什么是对象存储?

是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务

有什么用?

对象存储是一种数据存储模型,它将数据视为对象,每个对象都包含数据本身以及与之相关的元数据。对象存储通常用于存储大量非结构化数据,如图像、音频、视频、文档等。它与传统的文件系统存储方式不同,不需要文件夹层级结构,而是通过唯一的标识符来访问每个对象

简单来说就是存储文件,不需要存储在本地;比如说图床,可以直接访问。

用法:

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去放行的接口

官方文档:安装和部署MinIO — MinIO中文文档 | MinIO Linux中文文档

;