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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:37:01