使用Go语言上传图片至AWS S3后文件大小为0字节问题
Go上传AWS S3后文件大小为0字节的原因及解决办法
出现这种情况,核心问题是文件内容没有被正确读取并上传,常见原因和解决方式如下:
文件指针未重置到开头
如果你在打开文件后先执行了读取操作(比如获取文件大小),文件指针会停留在文件末尾。此时直接用这个文件对象作为上传Body,读取到的内容为空,导致S3生成0字节文件。解决办法是在上传前重置指针:_, err = file.Seek(0, io.SeekStart) if err != nil { // 处理错误 }错误忽略或空Body传递
如果os.Open文件失败但你没处理错误,或者错误地传递了空的io.Reader作为PutObjectInput的Body参数,S3会创建空文件。务必检查所有操作的返回错误,确保文件正常打开且Body指向有效的文件对象。文件提前关闭
如果你在上传完成前就调用了file.Close(),会导致读取文件内容时失败,最终上传空文件。建议用defer file.Close()确保文件在上传完成后再关闭。
正确的上传代码示例
package main import ( "context" "io" "os" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" ) func main() { // 加载AWS配置 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1")) if err != nil { panic("加载配置失败: " + err.Error()) } s3Client := s3.NewFromConfig(cfg) // 打开要上传的文件 targetFile, err := os.Open("./local-file.txt") if err != nil { panic("打开文件失败: " + err.Error()) } defer targetFile.Close() // 确保上传完成后关闭文件 // 重置文件指针到开头(如果之前有过读取操作) _, err = targetFile.Seek(0, io.SeekStart) if err != nil { panic("重置文件指针失败: " + err.Error()) } // 执行上传 _, err = s3Client.PutObject(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String("your-bucket-name"), Key: aws.String("s3-object-key.txt"), Body: targetFile, }) if err != nil { panic("上传文件失败: " + err.Error()) } }
额外提醒:上传前确认本地文件本身不是空的,同时检查AWS权限配置是否允许写入目标S3桶。
内容的提问来源于stack exchange,提问作者JASHFEER PE
相关产品推荐
相关产品推荐

