You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:37:52