minio客户端初始化需显式设secure: false,url不能带路径,accesskey/secretkey须匹配;上传文件应指定contenttype并注意io.reader生命周期。

用 minio-go 初始化客户端连 MinIO 时端口和 SSL 配置容易错
MinIO 默认走 HTTP(非 HTTPS),但 minio-go 客户端默认启用 SSL 校验,连本地 localhost:9000 会直接报 unable to verify the first certificate 或连接超时。
- 必须显式传
secure: false,哪怕 URL 写的是http://—— 客户端不看协议头,只认这个布尔值 - URL 中不能带路径,比如
http://localhost:9000/minio是错的,得是http://localhost:9000 - AccessKey/SecretKey 要和 MinIO 启动时配置一致(默认是
minioadmin/minioadmin)
client, err := minio.New("localhost:9000", &minio.Options{
Creds: credentials.NewStaticV4("minioadmin", "minioadmin", ""),
Secure: false, // 关键!不加这行连不上
})
PutObject 上传文件要注意 contentType 和 io.Reader 生命周期
上传时若不指定 contentType,MinIO 默认设为 application/octet-stream,浏览器下载后可能无法正确打开图片、PDF 等文件;同时,PutObject 接收的是 io.Reader,不是文件路径,别直接传 *os.File 后忘了 Close()。
- 推荐用
mime.TypeByExtension(filepath.Ext(name))自动推断类型 - 如果传
*os.File,务必在PutObject返回后立刻Close(),否则句柄泄漏 - 小文件(bytes.NewReader(data),避免临时文件 IO
_, err := client.PutObject(context.Background(), "mybucket", "photo.jpg",
file, fileSize, minio.PutObjectOptions{
ContentType: "image/jpeg", // 或用 mime.TypeByExtension(".jpg")
})
GetObject 下载时别卡在没读完就关流
调用 GetObject 返回的是 *minio.Object,本质是带 HTTP 连接的流。如果只取 object.Body 但没读完或没 Close(),下一次请求可能复用异常连接,报 net/http: request canceled 或连接池耗尽。
- 必须用
defer object.Close(),且放在GetObject成功之后 - 不要用
ioutil.ReadAll(object.Body)加载大文件到内存,改用io.Copy(dst, object.Body) - 如果只想校验是否存在,用
StatObject更轻量,避免拉取整个对象
object, err := client.GetObject(context.Background(), "mybucket", "data.zip", minio.GetObjectOptions{})
if err != nil {
log.Fatal(err)
}
defer object.Close() // 必须加
// 流式写入磁盘
f, _ := os.Create("downloaded.zip")
defer f.Close()
io.Copy(f, object.Body)
列出文件用 ListObjects 而不是 StatObject 遍历
想查某个前缀下有哪些文件,有人会写个循环对 key1、key2……挨个 StatObject,这不仅慢,还容易触发 MinIO 的请求限频。正确做法是用分页式列举,靠 prefix 和 recursive 控制范围。
立即学习“go语言免费学习笔记(深入)”;
-
prefix是目录前缀,如"logs/2024-06/",注意结尾斜杠影响匹配结果 -
recursive: true才会遍历子目录,false 相当于只列一级(类似 Linux 的ls不加-R) - 单次最多返回 1000 个对象,需检查
IsTruncated并用NextMarker继续拉取
for object := range client.ListObjects(context.Background(), "mybucket",
minio.ListObjectsOptions{Prefix: "images/", Recursive: true}) {
if object.Err != nil {
log.Println("list err:", object.Err)
continue
}
fmt.Println(object.Key, object.Size)
}
MinIO 的 Go SDK 行为和 AWS S3 SDK 高度一致,但本地调试时那一个 Secure: false 和 prefix 结尾的斜杠,是八成人在第一次集成时栽进去的地方。










