В результате загрузки файла лямбда 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
.