尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【minio】#4 | MinIO API 文件操作
一、文件上传PutObject / FPutObjectMinIO 上传特性文件超过 128MB 自动分片传输单文件上限 5TB。 模拟文件夹原理MinIO 本身没有文件夹概念通过 ObjectKey 前缀模拟目录如0114/ssh隧道命令.jpg。 访问地址拼接规则endPoint /桶名 /ObjectKey1. FPutObject直接传入本地文件路径上传适合读取服务器本地磁盘文件上传。func uploadFile1() { info, err : client.FPutObject(context.Background(), demo1, ssh隧道命令.jpg, ssh隧道命令.jpg, minio.PutObjectOptions{}) if err ! nil { fmt.Println(err) return } byteData, _ : json.Marshal(info) fmt.Println(string(byteData)) } func main() { uploadFile1() }2. PutObject传入文件流上传本地文件流可以携带自定义元数据UserMetadata用来存储 userId、客户端 IP 等业务信息。func uploadFile2() { file, _ : os.Open(ssh隧道命令.jpg) info, _ : file.Stat() data, err : client.PutObject(context.Background(), demo1, 0114/ssh隧道命令.jpg, file, info.Size(), minio.PutObjectOptions{ UserMetadata: map[string]string{ userId: 1, userIp: 2.5.21.22, }, }) if err ! nil { fmt.Println(err) return } }3. Gin Web 端 IO 流式上传前端表单文件推荐业务使用场景接收前端 form 表单上传文件不落地临时文件直接流转 MinIOfunc uploadView(c *gin.Context) { fileHeader, _ : c.FormFile(file) reader, err : fileHeader.Open() if err ! nil { log.Println(err) return } defer reader.Close() // 必须关闭流防止句柄泄漏 objectSize : fileHeader.Size uploadInfo, err : client.PutObject(context.Background(), fengfeng, fileHeader.Filename, reader, objectSize, minio.PutObjectOptions{ContentType: application/octet-stream}) if err ! nil { fmt.Println(err) return } fmt.Println(上传成功上传文件信息, uploadInfo) }业务完整版返回可访问地址 自定义元数据// Web上传完整版携带用户元数据返回访问链接 file, _ : fileHeader.Open() data, err : client.PutObject(context.Background(), demo1, uploads/fileHeader.Filename, file, fileHeader.Size, minio.PutObjectOptions{ UserMetadata: map[string]string{ userId: 1, userIp: c.ClientIP(), }, }) if err ! nil { fmt.Println(err) return } byteData, _ : json.Marshal(data) fmt.Println(string(byteData)) c.JSON(200, gin.H{data: fmt.Sprintf(http://%s/%s/%s, endPoint, data.Bucket, data.Key)})二、列出桶内文件 ListObjects作用遍历桶内对象支持前缀过滤、递归遍历子目录、读取自定义元数据。func fileList() { ch : client.ListObjects(context.Background(), demo1, minio.ListObjectsOptions{ Recursive: true, // true递归遍历所有子目录 Prefix: uploads,// 只匹配前缀uploads的对象筛选uploads目录 WithMetadata: true, // 开启才能读取UserMetadata自定义元数据 }) for info : range ch { fmt.Println(info.Key, info.LastModified, info.UserMetadata) } }参数说明Recursivetrue递归扫描 Prefix 下全部文件false 仅一级目录Prefix对象 key 前缀模拟文件夹筛选WithMetadata需要读取上传时自定义 UserMetadata 时开启三、文件下载两种方案1. FGetObject直接下载保存到本地磁盘直接将 MinIO 对象落地成本地文件代码最简适合服务端保存文件。// 整个文件下载和保存到指定目录适合文件下载如下载pdf文件 err : client.FGetObject(context.Background(), fengfeng, 1.md, 1.md, minio.GetObjectOptions{}) if err ! nil { fmt.Println(err) return } fmt.Println(成功)2. GetObject获取 io.Reader 文件流推荐 Web 前端下载返回对象流可以写入本地或者直接流式返回给浏览器不需要落地文件⚠️ 重要object必须 defer 关闭否则连接泄漏// 下载文件对象返回io.Reader流 object, err : client.GetObject(context.Background(), fengfeng, 1.md, minio.GetObjectOptions{}) if err ! nil { fmt.Println(err) return } file, _ : os.Create(x.md) defer file.Close() defer object.Close() io.Copy(file, object)四、删除文件 RemoveObject作用根据桶名 ObjectKey 删除指定单个文件。删除后不可恢复没有回收站默认func delFile() { bucketName : fengfeng objectKey : 1.md err : client.RemoveObject(context.Background(), bucketName, objectKey) if err ! nil { fmt.Println(删除失败, err) return } fmt.Println(文件删除成功) }Gin 接口版本Web 接口删除文件func delFileView(c *gin.Context) { bucketName : fengfeng objectKey : c.Query(key) err : client.RemoveObject(context.Background(), bucketName, objectKey) if err ! nil { c.JSON(500, gin.H{msg: 删除失败, err: err.Error()}) return } c.JSON(200, gin.H{msg: 删除成功}) }补充批量删除使用RemoveObjects适合一次性删除多个对象。核心知识点总结MinIO无真实文件夹依靠 ObjectKey 前缀模拟目录如uploads/test.jpg上传128MB 自动分片单文件上限 5TBPutObject 支持 UserMetadata存储业务自定义信息userId、ip 等ListObjects 查询文件Recursive 递归、Prefix 前缀筛选WithMetadata 读取自定义元数据下载FGetObject直接保存本地文件GetObject拿到 io 流灵活转发给前端大文件推荐流式IO 流操作切记defer reader.Close()防止文件句柄 / 连接池泄漏RemoveObject删除对象删除后默认不可恢复业务谨慎使用
RELATED

相关推荐

(论文速读)LogSAD:无需训练的结构异常与逻辑异常统一检测

(论文速读)LogSAD:无需训练的结构异常与逻辑异常统一检测

论文题目:Towards Training-free Anomaly Detection with Vision and Language Foundation Models(迈向基于视觉与语言基础模型的免训练异常检测) 会议:CVPR 2025 摘要:异常检测在工业质量检测等真实场景中具有重要价…

📅 2026/10/6 2:44:45
Psychol Med:有抑郁症状的老年人中结构-功能连接耦合的改变

Psychol Med:有抑郁症状的老年人中结构-功能连接耦合的改变

本篇文献发表在Psychological Medicine杂志。所发布内容旨在与大家分享学术新知,促进交流学习,版权归原作者或原出处所有,感谢各位学者的辛勤付出与研究成果。1. 引言抑郁症状和重度抑郁障碍在老年人中普遍存在,受到慢性疾病、睡眠…

📅 2026/10/6 2:44:45
PDF 论文处理器 — 优势与功能文档

PDF 论文处理器 — 优势与功能文档

PDF 论文处理器 — 优势与功能文档文档性质:核心功能总结、设计亮点提炼、相对通用方案的差异化优势1. 核心功能概览本工具围绕"把网安科研 PDF 变成 Dify 可用的高质量知识块"这一目标,提供以下端到端能力:功能说明对应模块智能 P…

📅 2026/10/6 2:44:45
MORE NEWS

更多资讯

📰

HTTP/2与HTTP/3核心机制对比及部署实战指南

HTTP/2 与 HTTP/3 的竞赛,本质上是互联网传输效率的极限追逐。我在实际项目里对比过这两代协议在弱网、移动端和服务端高并发场景下的表现,结论是:HTTP/2 靠“多路复用”解决了 HTTP/1.1 的连接排队问题,HTTP/3 则直接掀翻传输层桌…

📰

二叉树随机漫步:用蒙特卡洛思想探测树结构深度

刚看到一个很有意思的话题,把“二叉树”和“随机漫步”这两个词放在一起的时候,我第一反应是:这到底是在树上做随机游走,还是用二叉树去模拟一个随机过程?后来我仔细想了下,这个组合背后其实藏着一整类非常…

📰

中转API网关与Token机制实战:从JWT签发到限流计费全解析

做后端这些年,我越来越觉得,凡是和 API 打交道的项目,最后都绕不开两样东西:一层中转,一把 Token。上个月帮团队搭了一个内部的中转 API 网关,把好几家模型厂商的接口统一收敛到一个入口后面,用…

📰

轻量级Verilog仿真环境搭建:VSCode + iverilog + GTKWave 指南

你刚改完一行状态机的跳转条件,想在仿真里看下波形对不对,结果Quartus II光启动就要一分钟,编译整个工程又是好几分钟,好不容易调到ModelSim,还时不时弹出一个“failure to obtain a verilog simulation license”之类…

📰

大数运算课程设计:十进制与二进制高精度算法实现与避坑指南

简介:这份数据结构课程设计资源聚焦大数运算的完整实现,面向计算机专业学生及需要处理超长数值的开发者。项目覆盖大数加法、减法、乘法、除法、乘方与取模六类核心操作,并同时支持十进制与二进制大数运算,可应用于密码学、高性能…

📰

用Verilog设计MIPS32单周期CPU:从数据通路到指令执行的完整实战

做过FPGA或数字IC的人应该都有同感:学Verilog写了一堆计数器、状态机、UART收发、FIFO之后,总觉得差点意思,好像每个模块都会写,但脑子里始终没有一张完整的“计算机是怎么跑起来的”地图。直到你动手用Verilog搓出来一个单周期CP…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬