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);}}


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