Go lambda S3 文件上传结果为大小为 0 的新对象
Go lambda S3 file upload results in new object with size of 0
我正在用 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 的一些输出:
这是空对象:
那我做错了什么?
您刚刚创建并写入文件 f
,然后将其用作上传文件 Body
。发生的情况是文件中的当前位置在最后 - 这意味着有 0 个字节要读取。
你需要Seek
到文件开头,这样才有数据可以读取。
无论哪种方式,对于此用例,都没有必要在上传之前将文件写入存储 - 您可以使用 decoded
中已有的内存表示直接将其上传到 S3。
我正在用 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 的一些输出:
这是空对象:
那我做错了什么?
您刚刚创建并写入文件 f
,然后将其用作上传文件 Body
。发生的情况是文件中的当前位置在最后 - 这意味着有 0 个字节要读取。
你需要Seek
到文件开头,这样才有数据可以读取。
无论哪种方式,对于此用例,都没有必要在上传之前将文件写入存储 - 您可以使用 decoded
中已有的内存表示直接将其上传到 S3。