Golang如何从请求体解析文件到变量并转为io.Reader传入MinIO上传函数
可行解决建议
以下方案基于Go语言Web开发场景给出,所有方案最终拿到的变量都可直接满足MinIO写入函数的io.Reader参数要求:
方案1:Multipart表单上传(最常用场景)
这是前端上传文件的标准方案,请求体结构体对应字段定义为*multipart.FileHeader类型即可:
import "mime/multipart" type UploadImageReq struct { Image *multipart.FileHeader `form:"image" binding:"required"` }
使用时调用Open()方法即可拿到实现了io.Reader接口的文件对象,直接传入MinIO接口:
// 绑定请求参数完成后执行 file, err := req.Image.Open() if err != nil { // 处理文件打开错误 return } defer file.Close() // 用完必须关闭避免内存泄漏 // 直接传入MinIO的PutObject方法即可 _, err = minioClient.PutObject(context.Background(), "存储桶名", "文件存储路径", file, req.Image.Size, minio.PutObjectOptions{ ContentType: req.Image.Header.Get("Content-Type"), })
方案2:二进制流直传场景
如果前端直接把图片二进制数据放在请求体中,不需要表单包装,无需定义请求结构体,直接读取原生请求体即可:
// 直接从请求中取Body,本身就是io.Reader类型 fileReader := c.Request.Body fileSize := c.Request.ContentLength contentType := c.Request.Header.Get("Content-Type") defer fileReader.Close() // 直接传入MinIO接口 _, err = minioClient.PutObject(context.Background(), "存储桶名", "文件存储路径", fileReader, fileSize, minio.PutObjectOptions{ ContentType: contentType, })
方案3:Base64编码上传场景
如果前端把图片转成Base64字符串传输,请求体结构体对应字段定义为string类型即可:
type UploadImageReq struct { ImageBase64 string `json:"image_base64" binding:"required"` }
使用时把Base64字符串转成io.Reader类型传入MinIO:
import ( "encoding/base64" "strings" ) // 绑定请求参数完成后执行 decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(req.ImageBase64)) // 未知文件大小可以传-1,MinIO会自动采用分块上传处理 _, err = minioClient.PutObject(context.Background(), "存储桶名", "文件存储路径", decoder, -1, minio.PutObjectOptions{ ContentType: "image/png", // 按需调整实际文件类型 })
注意事项
- 只要是实现了
io.Reader接口的类型都可以直接传给MinIO写入函数,无需额外格式转换 - 涉及文件读取的操作必须添加
defer Close()逻辑,避免内存泄漏 - Base64上传会增加33%左右的数据体积,仅适合小图标类文件使用,大文件优先选前两种方案
内容的提问来源于stack exchange,提问作者Jakub Klimek
相关产品推荐
相关产品推荐

