前序文章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大功告成
企业数字化 ERP 产品动态
相关推荐
Twig `is odd` 奇偶测试:语法、源码实现与沙箱安全用法详解 后端 【免费下载链接】Twig Twig, the flexible, fast, and secure template language for PHP 项目地址: https://gitcode.com/gh_mirrors/tw/Twig 点击查看 免费下载 导读
odd 是 Twig 模板语言内置的一个数值测试(test),用于… · 2026/9/26 7:59:02
Baserow 自托管无代码数据库完整教程:从建表到自动化系统只需 3 步 Baserow 自托管无代码数据库完整教程:从建表到自动化系统只需 3 步 【免费下载链接】baserow Build databases, automations, apps & agents with AI — no code. Open source platform available on cloud and self-hosted. GDPR, HIPAA, SOC 2 compliant. Bes… · 2026/9/26 7:58:56
心脏病数据分析系统:Java全栈实战拆解与重难点解析 心脏病数据分析系统这类项目,本质上是一个典型的 Java 全栈实战案例,但又不完全是“增删改查脚手架”。它真正的技术含量集中在统计聚合、关联分析、可视化报表和医疗数据的处理细节上。如果你是因为找毕设参考、做技术练手、或者想转行医疗信息化方向而… · 2026/9/26 7:58:55
金融服务平台实战:从账户体系到支付对账的架构设计与避坑指南 说到金融服务的项目,圈内人都知道,这是一条“外表光鲜、内里刀山火海”的赛道。我这两年深度参与了一个面向个人与企业用户的一站式金融服务平台从立项到上线的全过程,踩过无数坑,也沉淀了不少心得。这篇文章不聊空泛的概念&#… · 2026/9/26 8:36:38
腾讯云服务器一年多少钱?2026年CVM配置选型与价格全解析 1. 云服务器选型前必须想清楚的几件事1.1 为什么“一年多少钱”这个问题没法一句话回答每次有人问我“腾讯云服务器一年多少钱”,我都得先反问回去:你要拿来干什么?这个问题就跟问“一辆车多少钱”一样,答案完全取决于你要的是代步… · 2026/9/26 8:36:38
Higgsfield AI视频生成工具详解:如何实现角色一致性短视频创作 Higgsfield这个词最近在短视频创作圈里频繁出现,我一直想找个机会把它拆开揉碎聊一聊。很多人第一次听到这个名字,会以为是某个粒子物理实验室的新成果,实际上它是一个AI视频生成工具,名字取自“希格斯场”——就是物理学里那个赋… · 2026/9/26 8:36:38
Higgsfield开源数字人视频生成:从照片到动态角色的技术与实践 第一次在技术群里看到 Higgsfield 生成的视频时,我第一反应是「这又是哪个 CG 工作室的预渲染 demo」。直到有人把模型权重链接甩出来,我才反应过来,这其实是一个 AI 视频生成方向的创业项目——传一张正脸照片上去,选个模板&… · 2026/9/26 8:36:38
AI编程周榜冲刺赛:Token消耗策略与Agent Plan实战指南 1. 从一场AI用量周榜冲刺赛说起:为什么“Token消耗量”成了开发者新的竞技场第一次看到“AI用量周榜冲刺赛”这个活动名称时,我脑子里冒出来的第一个念头不是奖品,而是——终于有人把“Token消耗量”这件事摆到台面上了。过去大半年ÿ… · 2026/9/26 8:36:32
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46