使用AWS S3 Go SDK上传文件后大小异常(仅69字节)
问题:AWS S3 Go SDK上传文件后大小仅69字节,与实际不符
使用AWS S3的Go SDK上传文件时,上传后的文件大小仅为69字节,和实际文件大小不一致。程序执行无报错,但无法定位问题。
原代码
package main import ( "fmt" "strings" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" ) // aws s3 putObject example: aws s3api put-object --bucket db-backup-huawen --key truco/rpmlist.txt(上传到bucket的位置) --body ./rpmlist.txt(本地文件) func main() { sess, err := session.NewSession(&aws.Config{ MaxRetries: aws.Int(3), Credentials: credentials.NewSharedCredentials("C:/Users/Administrator/Desktop/aws.ini", "aws-huawen-root"), Region: aws.String("sa-east-1"), }) if err != nil { return } s3api := s3.New(sess) input := &s3.PutObjectInput{ Body: aws.ReadSeekCloser(strings.NewReader("C:/Users/Administrator/Desktop/baxi_MGCenter_FULL_20230211_000001.bak")), Bucket: aws.String("db-backup-huawen"), Key: aws.String("truco/baxi_MGCenter_FULL_20230211_000001.bak"), } res, err := s3api.PutObject(input) if err != nil { fmt.Println(err) return } fmt.Println(res) }
现象
- 程序执行无错误提示,输出正常响应信息
- S3上的目标文件大小为69字节,与实际文件大小不符
问题原因
你错误地将文件路径字符串作为文件内容上传了。strings.NewReader("文件路径")会创建一个读取该路径字符串的Reader,上传的自然是路径文本本身,而这个路径字符串的长度正好是69字节,这就是S3文件大小异常的原因。
修复后的代码
package main import ( "fmt" "os" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" ) func main() { sess, err := session.NewSession(&aws.Config{ MaxRetries: aws.Int(3), Credentials: credentials.NewSharedCredentials("C:/Users/Administrator/Desktop/aws.ini", "aws-huawen-root"), Region: aws.String("sa-east-1"), }) if err != nil { fmt.Println("创建Session失败:", err) return } s3api := s3.New(sess) // 打开本地目标文件 filePath := "C:/Users/Administrator/Desktop/baxi_MGCenter_FULL_20230211_000001.bak" file, err := os.Open(filePath) if err != nil { fmt.Println("打开文件失败:", err) return } defer file.Close() // 确保上传完成后关闭文件 input := &s3.PutObjectInput{ Body: aws.ReadSeekCloser(file), // 使用文件句柄作为上传主体 Bucket: aws.String("db-backup-huawen"), Key: aws.String("truco/baxi_MGCenter_FULL_20230211_000001.bak"), } res, err := s3api.PutObject(input) if err != nil { fmt.Println("上传文件失败:", err) return } fmt.Println("上传成功:", res) }
关键修改说明
- 引入
os包替代strings包,用于操作本地文件 - 使用
os.Open()打开目标文件,获取文件句柄 - 将文件句柄传入
aws.ReadSeekCloser()作为Body参数,实现读取文件内容上传 - 添加
defer file.Close()确保文件资源被正确释放,避免内存泄漏
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

