Go应用可上传删除Minio对象,但Stat/GetObject返回空信息
问题分析与解决
核心问题
你的downloadFromMinio函数存在逻辑错误:从未将GetObject获取到的文件对象赋值给返回变量,始终返回初始化时的nil值,这就是后续判断file == nil为true、出现切片越界的根本原因。
从控制台输出可以看到,StatObject其实已经成功获取到了对象元数据(比如文件大小497741、Content-Type等),GetObject也成功拿到了下载对象,只是你没有把这个对象返回给调用方。
修改后的代码
func downloadFromMinio(rs *appResource, name string, userId float64) (multipart.File, error) { user, err := getUser(rs, int64(userId)) if err != nil { log.Println(err) return nil, err } clientIdString := strconv.FormatInt(*user.CompanyId, 10) bucketName := "company-" + clientIdString log.Println(bucketName) log.Println(name) found, err := rs.mc.BucketExists(context.Background(), bucketName) if err != nil { log.Println("Error checking if minio bucket exists") log.Println(err) return nil, err } if found { log.Println("Bucket found") } objInfo, err := rs.mc.StatObject(context.Background(), bucketName, name, minio.StatObjectOptions{}) if err != nil { log.Println("Error checking minio object metadata") log.Println(err) return nil, err } else { log.Println(objInfo) } downloadInfo, err := rs.mc.GetObject(context.Background(), bucketName, name, minio.GetObjectOptions{}) if err != nil { log.Println("Error downloading minio object") log.Println(err) return nil, err } log.Println("Successfully downloaded minio bytes: ", downloadInfo) // minio.Object实现了multipart.File接口,直接返回即可 return downloadInfo, nil }
关键修改点
- 移除冗余的
var file multipart.File初始化,错误场景直接返回nil - 函数末尾返回
downloadInfo——minio.Object类型完全兼容multipart.File接口(两者均为io.ReadCloser的别名) - 修正错误返回值,确保无异常时返回
nil
额外注意事项
调用该函数的代码需要负责关闭返回的文件对象,避免资源泄漏:
file, err := downloadFromMinio(rs, fileName, userId) if err != nil { // 错误处理逻辑 } defer file.Close() // 后续读取文件内容的逻辑
内容的提问来源于stack exchange,提问作者markhorrocks
相关产品推荐
相关产品推荐

