【问题标题】:Go lambda S3 file upload results in new object with size of 0Go lambda S3 文件上传会生成大小为 0 的新对象
【发布时间】:2021-05-28 21:30:45
【问题描述】:

我正在使用 aws lambda 编写我的第一个 golang api。这个想法是能够从浏览器录制音频并保存为 s3 中的对象。我已经能够将对象保存在 s3 存储桶中的所需位置,但文件的大小始终为 0 / 0 kbs。但是当我创建一个文件并写入它时,它有大小。

这是我的代码:

func Handler(ctx context.Context, event PutAudiosEvent) (string, error) {
    decoded, err := base64.StdEncoding.DecodeString(event.FileContents)
    if err != nil {
        fmt.Println("Error decoding string")
        return "", err
    }
    //fmt.Println("Decoded is:", decoded)

    f, err := os.Create("/tmp/" + event.FileName)
    if err != nil {
        fmt.Println("Error creating file")
        return "", err
    }
    defer f.Close()

    numBytes, err := f.Write(decoded)
    fmt.Println("Num bytes:", numBytes)
    if err != nil {
        fmt.Println("Error writing")
        return "", err
    }

    if err = f.Sync(); err != nil {
        fmt.Println("Error syncing")
        return "", err
    }

    fileInfo, err := f.Stat()
    fmt.Println("Size:", fileInfo.Size())
    fmt.Println("Name:", fileInfo.Name())
    fmt.Println("Is dir:", fileInfo.IsDir())
    fmt.Println("Mode:", fileInfo.Mode())
    fmt.Println("Modtime", fileInfo.ModTime())
    fmt.Println("fileSys:", fileInfo.Sys())

    fmt.Println(event.UserName + "/" + event.Course + "/" + event.FileName)
    resp, err := s3Uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(BUCKET_NAME),
        Key: aws.String(event.UserName + "/" + event.Course + "/" + event.Type + "/" + event.FileName),
        Body: f,
        ContentType: aws.String("audio/mpeg"),
    })

    if err != nil {
        fmt.Println("Error uploading", err)
        fmt.Println("Resp is:", resp)
        return "Error2", nil
    }

    return "File named '" + event.FileName + "' successfully uploaded", nil
}

以下是 cloudwatch 的一些输出:

这是空对象:

那我做错了什么?

【问题讨论】:

  • 上传前试试Seek
  • 就是这样,谢谢!
  • 通过直接从内存中读取来简化代码:Body: bytes.NewReader(decoded),
  • ……但如果你真的需要一个临时工。文件,请使用io/ioutil.TempFile
  • ...或者,从 Go 1.16 开始,对于临时文件,os.CreateTemp

标签: amazon-web-services go amazon-s3 lambda aws-lambda-go


【解决方案1】:

您刚刚创建并写入文件f,然后您将其用作上传Body。发生的情况是文件中的当前位置在最后——这意味着有 0 个字节要读取。

你需要Seek到文件的开头,以便有数据可以读取。

无论哪种方式,对于此用例,都无需在上传之前将文件写入存储 — 您可以使用 decoded 中已有的内存表示将其直接上传到 S3。

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2019-11-20
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多