0


Springboot整合Minio对象存储超级详细讲解以及配置搭建

windows环境下搭建minio步骤

1.从minio官网进行查看详细信息

    地址:https://min.io/
    里面有详细的配置信息
    搭建成功之后如下如所示:用户名密码默认情况下为 username:minioadmin password:minioadmin

在这里插入图片描述

2.搭建成功之后的访问

    地址:服务ip 端口9000
    http//127.0.0.1:9000 用户名密码为默认:minioadmin 
    创建桶时候要注意桶的名称

在这里插入图片描述

springboot整合和minio的步骤如下

1.pom坐标的指定

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.2</version></dependency><!--Hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.18</version></dependency>

2.配置文件的设置如下

packagecom.java.javamethod.conf;importio.minio.MinioClient;importlombok.SneakyThrows;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.annotation.Resource;/**
 * Minio配置类
 * @Author ww
 * @Date 2024/5/21 10:06
 * @Version 1.0
 */@Configuration@EnableConfigurationProperties(MinioProperties.class)@ConditionalOnProperty(value ="oss.name", havingValue ="minio")publicclassMinioConfiguration{@ResourceprivateMinioProperties ossProperties;@Bean@SneakyThrowspublicMinioClientminioClient(){returnMinioClient.builder().endpoint(ossProperties.getEndpoint()).credentials(ossProperties.getAccessKey(), ossProperties.getSecretKey()).build();}}
packagecom.java.javamethod.conf;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importjava.util.List;/**
 * @Author ww
 * @Date 2024/5/21 10:08
 * @Version 1.0
 */@Data@ConfigurationProperties(prefix =MinioProperties.PREFIX)publicclassMinioProperties{/**
     * 配置前缀
     */publicstaticfinalStringPREFIX="oss";/**
     * 对象存储名称
     */privateString name;/**
     * 对象存储服务的URL
     */privateString endpoint;/**
     * Access key 账户ID
     */privateString accessKey;/**
     * Secret key 密码
     */privateString secretKey;/**
     * 默认的存储桶名称
     */privateString bucketName ="qditwei";/**
     * 可上传的文件后缀名
     */privateList<String> fileExt;}

3.minio工具类的封装

packagecom.java.javamethod.service;importcom.java.javamethod.domain.OssFile;importorg.springframework.web.multipart.MultipartFile;importjavax.servlet.http.HttpServletResponse;importjava.io.InputStream;importjava.util.List;/**
 * @Author ww
 * @Date 2024/5/21 10:54
 * @Version 1.0
 */publicinterfaceOssTemplate{/**
     * 存储桶是否存在
     *
     * @param bucketName 存储桶名称
     * @return boolean
     */booleanbucketExists(String bucketName);/**
     * 获取文件信息
     *
     * @param fileName 存储桶文件名称
     * @return InputStream
     */OssFilegetOssInfo(String fileName);/**
     * 上传文件
     *
     * @param folderName 上传的文件夹名称
     * @param fileName   上传文件名
     * @param file       上传文件类
     * @return BladeFile
     */OssFileupLoadFile(String folderName,String fileName,MultipartFile file);/**
     * 上传文件
     *
     * @param folderName 上传的文件夹名称
     * @param fileName   存储桶对象名称
     * @param suffix     文件后缀名
     * @param stream     文件流
     * @return BladeFile
     */OssFileupLoadFile(String folderName,String fileName,String suffix,InputStream stream);/**
     * 删除文件
     *
     * @param fileName 存储桶对象名称
     */booleanremoveFile(String fileName);/**
     * 批量删除文件
     *
     * @param fileNames 存储桶对象名称集合
     */booleanremoveFiles(List<String> fileNames);/**
     * @Description: 下载文件
     * @Param response: 响应
     * @Param fileName: 文件名
     * @Param filePath: 文件路径
     * @return: void
     */voiddownloadFile(HttpServletResponse response,String fileName,String filePath);}packagecom.java.javamethod.util;importcn.hutool.core.date.DateUtil;importcn.hutool.core.io.IoUtil;importcn.hutool.core.text.StrPool;importcn.hutool.core.util.ObjectUtil;importcom.java.javamethod.conf.MinioProperties;importcom.java.javamethod.domain.OssFile;importcom.java.javamethod.service.OssTemplate;importio.minio.*;importio.minio.http.Method;importio.minio.messages.DeleteObject;importlombok.SneakyThrows;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Service;importorg.springframework.util.Assert;importorg.springframework.web.multipart.MultipartFile;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletResponse;importjava.io.File;importjava.io.InputStream;importjava.net.URLEncoder;importjava.util.List;importjava.util.stream.Stream;/**
 * @Author ww
 * @Date 2024/5/21 10:52
 * @Version 1.0
 */@Slf4j@ServicepublicclassMinioTemplateimplementsOssTemplate{/**
     * MinIO客户端
     */@ResourceprivateMinioClient client;/**
     * 配置类
     */@ResourceprivateMinioProperties ossProperties;/**
     * 格式化时间
     */privatestaticfinalStringDATE_FORMAT="yyyyMMdd";/**
     * 字符集
     */privatestaticfinalStringENCODING="UTF-8";/**
     * 存储桶是否存在
     *
     * @param bucketName 存储桶名称
     * @return boolean
     */@OverridepublicbooleanbucketExists(String bucketName){try{return client.bucketExists(BucketExistsArgs.builder().bucket(getBucketName(bucketName)).build());}catch(Exception e){
            log.error("minio bucketExists Exception:{}", e);}returnfalse;}/**
     * @Description: 创建 存储桶
     * @Param bucketName: 存储桶名称
     */publicvoidmakeBucket(String bucketName){try{if(!client.bucketExists(BucketExistsArgs.builder().bucket(getBucketName(bucketName)).build())){
                client.makeBucket(MakeBucketArgs.builder().bucket(getBucketName(bucketName)).build());
                log.info("minio makeBucket success bucketName:{}", bucketName);}}catch(Exception e){
            log.error("minio makeBucket Exception:{}", e);}}/**
     * 获取文件信息
     *
     * @param fileName 存储桶文件名称
     * @return InputStream
     */@OverridepublicOssFilegetOssInfo(String fileName){try{StatObjectResponse stat = client.statObject(StatObjectArgs.builder().bucket(getBucketName(ossProperties.getBucketName())).object(fileName).build());OssFile ossFile =newOssFile();
            ossFile.setName(ObjectUtil.isEmpty(stat.object())? fileName : stat.object());
            ossFile.setFilePath(ossFile.getName());
            ossFile.setDomain(getOssHost(ossProperties.getBucketName()));
            ossFile.setHash(String.valueOf(stat.hashCode()));
            ossFile.setSize(stat.size());
            ossFile.setPutTime(DateUtil.date(stat.lastModified().toLocalDateTime()));
            ossFile.setContentType(stat.contentType());return ossFile;}catch(Exception e){
            log.error("minio getOssInfo Exception:{}", e);}returnnull;}/**
     * 上传文件
     *
     * @param folderName 上传的文件夹名称
     * @param fileName   上传文件名
     * @param file       上传文件类
     * @return BladeFile
     */@Override@SneakyThrowspublicOssFileupLoadFile(String folderName,String fileName,MultipartFile file)throwsRuntimeException{if(file ==null|| file.isEmpty()){thrownewRuntimeException("文件不能为空");}// 文件大小if(file.getSize()>5*1024*1024){thrownewRuntimeException("文件大小不能超过5M");}String suffix =getFileExtension(file.getOriginalFilename());// 文件后缀判断/*if (!CollUtil.contains(ossProperties.getFileExt(), suffix)) {
            String error = String.format("文件类型错误,目前支持[%s]等文件类型",
                    String.join(",", ossProperties.getFileExt()));
            throw new RuntimeException(error);
        }*/try{returnupLoadFile(folderName, fileName, suffix, file.getInputStream());}catch(Exception e){
            log.error("minio upLoadFile Exception:{}", e);thrownewRuntimeException("文件上传失败,请重新上传或联系管理员");}}/**
     * 获取文件后缀名
     *
     * @param fullName 文件全名
     * @return {String}
     */publicstaticStringgetFileExtension(String fullName){Assert.notNull(fullName,"minio file fullName is null.");String fileName =newFile(fullName).getName();int dotIndex = fileName.lastIndexOf('.');return(dotIndex ==-1)?"": fileName.substring(dotIndex +1);}/**
     * 上传文件
     *
     * @param folderName 上传的文件夹名称
     * @param fileName   存储桶对象名称
     * @param suffix     文件后缀名
     * @param stream     文件流
     * @return BladeFile
     */@OverridepublicOssFileupLoadFile(String folderName,String fileName,String suffix,InputStream stream){try{returnupLoadFile(ossProperties.getBucketName(), folderName, fileName, suffix, stream,"application/octet"+"-stream");}catch(Exception e){
            log.error("minio upLoadFile Exception:{}", e);}returnnull;}/**
     * @Description: 上传文件
     * @Param bucketName: 存储桶名称
     * @Param folderName: 上传的文件夹名称
     * @Param fileName: 上传文件名
     * @Param suffix: 文件后缀名
     * @Param stream: 文件流
     * @Param contentType: 文件类型
     */@SneakyThrowspublicOssFileupLoadFile(String bucketName,String folderName,String fileName,String suffix,InputStream stream,String contentType){if(!bucketExists(bucketName)){
            log.info("minio bucketName is not creat");makeBucket(bucketName);}OssFile file =newOssFile();String originalName = fileName;String filePath =getFilePath(folderName, fileName, suffix);
        client.putObject(PutObjectArgs.builder().bucket(getBucketName(bucketName)).object(filePath).stream(stream, stream.available(),-1).contentType(contentType).build());
        file.setOriginalName(originalName);
        file.setName(filePath);
        file.setDomain(getOssHost(bucketName));
        file.setFilePath(filePath);
        stream.close();
        log.info("minio upLoadFile success, filePath:{}", filePath);return file;}/**
     * 删除文件
     *
     * @param fileName 存储桶对象名称
     */@OverridepublicbooleanremoveFile(String fileName){try{
            client.removeObject(RemoveObjectArgs.builder().bucket(getBucketName(ossProperties.getBucketName())).object(fileName).build());
            log.info("minio removeFile success, fileName:{}", fileName);returntrue;}catch(Exception e){
            log.error("minio removeFile fail, fileName:{}, Exception:{}", fileName, e);}returnfalse;}/**
     * 批量删除文件
     *
     * @param fileNames 存储桶对象名称集合
     */@OverridepublicbooleanremoveFiles(List<String> fileNames){try{Stream<DeleteObject> stream = fileNames.stream().map(DeleteObject::new);
            client.removeObjects(RemoveObjectsArgs.builder().bucket(getBucketName(ossProperties.getBucketName())).objects(stream::iterator).build());
            log.info("minio removeFiles success, fileNames:{}", fileNames);returntrue;}catch(Exception e){
            log.error("minio removeFiles fail, fileNames:{}, Exception:{}", fileNames, e);}returnfalse;}/**
     * @Description: 下载文件
     * @Param response: 响应
     * @Param fileName: 文件名
     * @Param filePath: 文件路径
     */@OverridepublicvoiddownloadFile(HttpServletResponse response,String fileName,String filePath){GetObjectResponse is =null;try{GetObjectArgs getObjectArgs =GetObjectArgs.builder().bucket(ossProperties.getBucketName()).object(filePath).build();
            is = client.getObject(getObjectArgs);// 设置文件ContentType类型,这样设置,会自动判断下载文件类型
            response.setContentType("application/x-msdownload");
            response.setCharacterEncoding(ENCODING);// 设置文件头:最后一个参数是设置下载的文件名并编码为UTF-8
            response.setHeader("Content-Disposition","attachment;fileName="+URLEncoder.encode(fileName,ENCODING));IoUtil.copy(is, response.getOutputStream());
            log.info("minio downloadFile success, filePath:{}", filePath);}catch(Exception e){
            log.error("minio downloadFile Exception:{}", e);}finally{IoUtil.close(is);}}/**
     * 获取文件外链
     *
     * @param bucketName bucket名称
     * @param fileName   文件名称
     * @param expires    过期时间
     * @return url
     */publicStringgetPresignedObjectUrl(String bucketName,String fileName,Integer expires){String link ="";try{
            link = client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(getBucketName(bucketName)).object(fileName).expiry(expires).build());}catch(Exception e){
            log.error("minio getPresignedObjectUrl is fail, fileName:{}", fileName);}return link;}/**
     * 根据规则生成存储桶名称规则
     *
     * @param bucketName 存储桶名称
     * @return String
     */privateStringgetBucketName(String bucketName){return bucketName;}/**
     * 根据规则生成文件路径
     *
     * @param folderName       上传的文件夹名称
     * @param originalFilename 原始文件名
     * @param suffix           文件后缀名
     * @return string 上传的文件夹名称/yyyyMMdd/原始文件名_时间戳.文件后缀名
     */privateStringgetFilePath(String folderName,String originalFilename,String suffix){returnStrPool.SLASH+String.join(StrPool.SLASH, folderName,DateUtil.date().toString(DATE_FORMAT),
                originalFilename)+StrPool.C_UNDERLINE+DateUtil.current()+StrPool.DOT+ suffix;}/**
     * 获取域名
     *
     * @param bucketName 存储桶名称
     * @return String
     */publicStringgetOssHost(String bucketName){return ossProperties.getEndpoint()+StrPool.SLASH+getBucketName(bucketName);}}

4.swagger功能的验证

packagecom.java.javamethod.controller;importcom.java.javamethod.domain.OssFile;importcom.java.javamethod.util.MinioTemplate;importio.swagger.annotations.Api;importio.swagger.annotations.ApiImplicitParam;importio.swagger.annotations.ApiImplicitParams;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RequestPart;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjavax.annotation.Resource;/**
 * @Author ww
 * @Date 2024/5/21 10:23
 * @Version 1.0
 */@RestController@Api(tags ="文件控制器", description ="文件管理控制器")publicclassFileController{@ResourceMinioTemplate minioTemplate;@PostMapping("/upload")@ApiImplicitParams(value ={@ApiImplicitParam(name ="folderName", value ="文件路径", required =true, dataType ="String"),@ApiImplicitParam(name ="fileName", value ="文件名", required =true, dataType ="String")})// 注意seagger上传文件时候一定要加@RequestPart否则可能没法进行上传文件publicOssFileupload(String folderName,String fileName,@RequestPartMultipartFile file){return minioTemplate.upLoadFile( folderName, fileName, file);}}

在这里插入图片描述

在这里插入图片描述

标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/qq_41324075/article/details/139088460
版权归原作者 QD_IT伟 所有, 如有侵权,请联系我们删除。

“Springboot整合Minio对象存储超级详细讲解以及配置搭建”的评论:

还没有评论