资讯动态

SpringBoot如何集成MinIO

发布时间:2026/9/26 7:59:18 来源:尧图企业网站定制
前序文章windows下的MinIO的下载与安装windows下MinIO的基础用法本文涉及到的工具IDEA 2024.1SpringBoot 3.xMinIOJDK17本文源代码下载(1) 百度网盘通过网盘分享的文件demo_MinIO.zip链接: https://pan.baidu.com/s/1Q3oyn8zSwsW0CM55OX7-xQ?pwdw8g5 提取码: w8g52夸克网盘我用夸克网盘给你分享了「demo_MinIO.zip」点击链接或复制整段内容打开「夸克APP」即可获取。/f5c23b5iSz链接https://pan.quark.cn/s/840aeaecf512?pwdtMG7提取码tMG7注意项目要和你的MinIO用户名和密码匹配。1.创建Spring Boot项目打开IDEA, 点击“文件”——“新建”—“项目”这里服务器URL选择可以点击右边的 齿轮输入 https://start.spring.io语言选Java类型选Maven, JDK选17这里Spring Boot的版本选择3.x版本然后选择“Web”下面的 “Spring Web”然后点击“Web“创建完项目后如下打开pom.xml增加MinIO的依赖dependencygroupIdio.minio/groupIdartifactIdminio/artifactIdversion8.4.3/version/dependency建议去官网看具体版本号不要乱写https://www.minio.org.cn/download.shtml#/windows在IDEA中增加后依赖以后然后点击maven刷新把MinIO的依赖下载下来。依赖下载完后就不爆红了2.修改配置文件和启动类我们打开配置文件application.properties,增加关于MinIO的配置内容# MinIO 配置minio.endpointhttp://localhost:9000 minio.access-keyminioadmin minio.secret-keyminioadminminio.bucketonline-file minio.connect-timeout60s minio.write-timeout60s minio.read-timeout60s如果这里的配置文件如果是application.yaml配置文件那么配置内容按照下面方式填写# MinIO 配置minio: endpoint: http://localhost:9000 access-key: minioadmin secret-key: minioadmin bucket: online-file# 默认桶名称可自定义connect-timeout: 60s write-timeout: 60s read-timeout: 60s注意此处的access-key和secret-key是你启动后的关于API部分的用户名和密码。如果这里没有写对可能会出现“InvalidAccessKeyId: The Access Key Id you provided does not exist in our records.”这个报错。然后。。打开Spring Boot的启动类 加入ComponentScanComponentScan(basePackagescom.guo)注意:com.guo是你的包名3.创建配置类packagecom.guo.config;importio.minio.MinioClient;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassMinioConfig{Value(${minio.endpoint})privateStringendpoint;Value(${minio.access-key})privateStringaccessKey;Value(${minio.secret-key})privateStringsecretKey;Value(${minio.connect-timeout})privateStringconnectTimeout;Value(${minio.write-timeout})privateStringwriteTimeout;Value(${minio.read-timeout})privateStringreadTimeout;BeanpublicMinioClientminioClient(){returnMinioClient.builder().endpoint(endpoint).credentials(accessKey,secretKey).build();}}4.封装工具类一般开发中把MinIO封装成工具类右击项目选择新建—“Package”然后这里的包名输入“service”然后右击刚才创建的service文件夹然后点击“”创建类名为MinIOService下面开始编写Service层代码packagecom.guo.service;importio.minio.*;importio.minio.http.Method;importio.minio.messages.Bucket;importjakarta.servlet.http.HttpServletResponse;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Service;importorg.springframework.web.multipart.MultipartFile;importjava.io.InputStream;importjava.net.URLEncoder;importjava.nio.charset.StandardCharsets;importjava.time.LocalDateTime;importjava.util.List;importjava.util.UUID;ServicepublicclassMinIOService{privatestaticfinalLoggerlogLoggerFactory.getLogger(MinIOService.class);Value(${minio.bucket})privateStringdefaultBucket;//客户端privatefinalMinioClientminioClient;//构造函数publicMinIOService(MinioClientminioClient){this.minioClientminioClient;}/** * 确保桶存在不存在则创建 */publicvoidensureBucketExists(StringbucketName)throwsException{booleanfoundminioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if(!found){minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());log.info(Bucket created: {},bucketName);}}/** * 文件上传 */publicStringuploadFile(MultipartFilefile,StringbucketName)throwsException{if(file.isEmpty()){thrownewIllegalArgumentException(文件不能为空);}// 使用时间路径 UUID 防止重名StringfileNameLocalDateTime.now().getYear()/UUID.randomUUID()_file.getOriginalFilename();try(InputStreaminputStreamfile.getInputStream()){minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream,file.getSize(),-1).contentType(file.getContentType()).build());}log.info(文件上传成功: bucket{}, fileName{},bucketName,fileName);returnfileName;// 返回对象名可用于访问或数据库保存}/** * 文件下载直接写入响应流 */publicvoiddownloadFile(StringfileName,StringbucketName,HttpServletResponseresponse)throwsException{GetObjectResponseobjectminioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());// 设置响应头response.setContentType(application/octet-stream);response.setHeader(Content-Disposition,attachment;filenameURLEncoder.encode(fileName.substring(fileName.lastIndexOf(/)1),StandardCharsets.UTF_8));// 写入输出流object.transferTo(response.getOutputStream());response.flushBuffer();}/** * 删除文件 */publicvoiddeleteFile(StringfileName,StringbucketName)throwsException{minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());log.info(文件已删除: bucket{}, fileName{},bucketName,fileName);}/** * 获取文件预签名 URL临时可访问链接 */publicStringgetPresignedUrl(StringfileName,StringbucketName,IntegerexpiresSeconds)throwsException{returnminioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(fileName).expiry(expiresSeconds!null?expiresSeconds:60*60)// 默认1小时.build());}/** * 列出所有桶 */publicListBucketlistBuckets()throwsException{returnminioClient.listBuckets();}}5.创建接口层右击包名点击”新建“—“Package”,包名定位controller然后右击刚才创建的controller文件夹点击“新建”—“Java 类”类名为MinIOController然后开始编写相关代码相关参考代码如下packagecom.guo.controller;importcom.guo.service.MinIOService;importio.minio.messages.Bucket;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/** * MinIO 文件存储操作控制器 * 提供文件上传、下载、删除、获取访问链接、查询存储桶等接口 * * author guo */RestControllerRequestMapping(/minio)publicclassMinIOController{/** * MinIO 业务逻辑处理服务 * 由 Spring 容器通过构造方法注入 */privatefinalMinIOServiceminIOService;/** * 构造方法注入 MinIO 服务Spring 推荐的依赖注入方式 * * param minIOService MinIO业务服务层对象 */publicMinIOController(MinIOServiceminIOService){this.minIOServiceminIOService;}//默认显示内容GetMapping(/)publicStringindex(){returnMinIO 文件服务已启动成功;}/** * 文件上传接口 * 支持指定存储桶默认存储桶online-file * * param file 上传的文件对象必传 * param bucket 存储桶名称可选默认值 online-file * return 上传成功后的文件访问标识/路径 * throws Exception 上传过程中可能抛出的异常IO异常、MinIO服务异常等 */PostMapping(/upload)publicMapString,Objectupload(RequestParam(file)MultipartFilefile,RequestParam(valuebucket,defaultValueonline-file)Stringbucket)throwsException{MapString,ObjectmapnewHashMap();try{minIOService.ensureBucketExists(bucket);// 上传后会返回 带乱码的完整文件名StringfullFileNameminIOService.uploadFile(file,bucket);map.put(success,true);map.put(originalFilename,file.getOriginalFilename());// 你本地的文件名测试文件1.txtmap.put(minioFullFileName,fullFileName);// minio里的完整文件名带乱码map.put(bucket,bucket);map.put(downloadUrl,http://localhost:8080/minio/download?fileNamefullFileNamebucketbucket);// 直接给你生成好下载链接returnmap;}catch(Exceptione){map.put(success,false);map.put(error,e.getMessage());returnmap;}}/** * 文件下载接口 * 直接将文件流写入响应体供浏览器/客户端下载 * * param fileName 要下载的文件名必传 * param bucket 存储桶名称可选默认值 online-file * param response Http响应对象用于输出文件流 * throws Exception 下载过程中抛出的异常 */GetMapping(/download)publicMapString,Objectdownload(RequestParam(fileName)StringfileName,RequestParam(valuebucket,defaultValueonline-file)Stringbucket,HttpServletResponseresponse){MapString,ObjectresultnewHashMap();try{// 先确保桶存在minIOService.ensureBucketExists(bucket);// 执行下载minIOService.downloadFile(fileName,bucket,response);result.put(success,true);result.put(message,文件下载处理完成);}catch(Exceptione){result.put(success,false);result.put(error,下载失败e.getMessage());// 打印详细错误到控制台e.printStackTrace();}returnresult;}/** * 文件删除接口 * 根据文件名和存储桶删除指定文件 * * param fileName 要删除的文件名必传 * param bucket 存储桶名称可选默认值 online-file * return 删除成功提示字符串 * throws Exception 删除过程中抛出的异常 */DeleteMapping(/delete)publicStringdelete(RequestParam(fileName)StringfileName,RequestParam(valuebucket,defaultValueonline-file)Stringbucket)throwsException{minIOService.deleteFile(fileName,bucket);returnsuccess;}/** * 获取文件临时访问URL带过期时间 * 用于授权访问私有存储桶中的文件 * * param fileName 文件名必传 * param bucket 存储桶名称可选默认值 online-file * param expires 链接过期时间秒非必传 * return 临时访问URL字符串 * throws Exception 获取链接过程中抛出的异常 */GetMapping(/url)publicStringgetUrl(RequestParam(fileName)StringfileName,RequestParam(valuebucket,defaultValueonline-file)Stringbucket,RequestParam(valueexpires,requiredfalse)Integerexpires)throwsException{returnminIOService.getPresignedUrl(fileName,bucket,expires);}/** * 查询 MinIO 中所有的存储桶列表 * * return 存储桶列表集合 * throws Exception 查询过程中抛出的异常 */GetMapping(/buckets)publicMapString,ObjectlistBuckets()throwsException{MapString,ObjectresultnewHashMap();try{ListBucketbucketsminIOService.listBuckets();result.put(success,true);result.put(count,buckets.size());result.put(data,buckets.stream().map(Bucket::name).toList());}catch(Exceptione){result.put(success,false);result.put(error,e.getMessage());result.put(data,newjava.util.ArrayList());}returnresult;}}6.启动并测试先本地启动MinIO服务再启动Spring Boot项目启动项目后SpringBoot 启动后默认端口是80801上传文件测试我们在D盘根目录放一个txt文件名字为测试文件1.txt打开cmd执行下面的命令curl-XPOSThttp://localhost:8080/minio/upload?buckettest99-FfileD:\测试文件1.txt上面的含义是把D盘根目录的测试文件1.txt,上传到MinIO的名字为test99的bucket执行成功后界面参考如下打开MinIO,可以看到文件上传成功从返回的信息看下载地址为http://localhost:8080/minio/download?fileName2026/ad635446-728b-4ae2-b5b6-8ce2c7628dfa_测试文件1.txtbuckettest99这里的“ad635446-728b-4ae2-b5b6-8ce2c7628dfa”是生成的随机前缀每次上传都不一样。实际开发中上传文件后一般会把下载地址存到数据库中等下次需要下载时调用这个下载地址即可。{bucket:test99,minioFullFileName:2026/ad635446-728b-4ae2-b5b6-8ce2c7628dfa_测试文件1.txt,success:true,downloadUrl:http://localhost:8080/minio/download?fileName2026/ad635446-728b-4ae2-b5b6-8ce2c7628dfa_测试文件1.txtbuckettest99,originalFilename:测试文件1.txt}2下载文件测试打开MinIO找到要下载的文件复制一下文件的名字。上面的内容复制后是下面这样:test99/2026/ad635446-728b-4ae2-b5b6-8ce2c7628dfa_测试文件1.txttest99是bucket的名字后面是文件的名字。然后把下面命令进行替换。http://localhost:8080/minio/download?fileName2026/ad635446-728b-4ae2-b5b6-8ce2c7628dfa_测试文件1.txtbuckettest99在浏览器中输入上面的地址就可以看到下载的文件了下载如果出现{success:false,error:下载失败The specified key does not exist.}是没有找到文件。3查看Bucket信息在浏览器中输入http://localhost:8080/minio/buckets可以看到创建的buckts列表OK大功告成

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑