☰
【minio】#4 | MinIO API 文件操作
2026/10/6 2:49:40 网站建设 项目流程

一、文件上传(PutObject / FPutObject)

MinIO 上传特性:文件超过 128MB 自动分片传输;单文件上限 5TB。 模拟文件夹原理:MinIO 本身没有文件夹概念,通过 ObjectKey 前缀模拟目录,如0114/ssh隧道命令.jpg。 访问地址拼接规则:endPoint + /桶名 + /ObjectKey

1. 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 表单上传文件,不落地临时文件,直接流转 MinIO

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

参数说明

  • Recursive=true:递归,扫描 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,适合一次性删除多个对象。

核心知识点总结

  1. MinIO无真实文件夹,依靠 ObjectKey 前缀模拟目录,如uploads/test.jpg
  2. 上传:>128MB 自动分片,单文件上限 5TB
  3. PutObject 支持 UserMetadata,存储业务自定义信息(userId、ip 等)
  4. ListObjects 查询文件:Recursive 递归、Prefix 前缀筛选,WithMetadata 读取自定义元数据
  5. 下载
    • FGetObject:直接保存本地文件
    • GetObject:拿到 io 流,灵活转发给前端,大文件推荐流式
  6. IO 流操作切记:defer reader.Close(),防止文件句柄 / 连接池泄漏
  7. RemoveObject:删除对象,删除后默认不可恢复,业务谨慎使用

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询