В результате загрузки файла лямбда S3 появился новый объект размером 0

Я пишу свой первый golang api с aws lambda. Идея в том, чтобы иметь возможность записывать аудио из браузера и сохранять как объект в s3. Я дошел до того, что смог сохранить объект в желаемом месте в ведре s3, но размер файла всегда 0/0 кбайт. Но когда я создаю файл и пишу в него, он имеет размер.

Вот мой код:

      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:

А вот пустой объект:

Так что я делаю не так?

1 ответ

Решение

Вы только что создали и записали в файл f, а затем вы используете его как загрузку Body. Что происходит, так это то, что текущая позиция в файле находится в самом конце - это означает, что осталось прочитать 0 байтов.

Тебе следует Seek в начало файла, чтобы там были данные для чтения.

В любом случае, для этого варианта использования нет необходимости записывать файл в хранилище перед загрузкой - вы можете просто загрузить его непосредственно в S3, используя представление в памяти, которое у вас уже есть в decoded.

Другие вопросы по тегам