AWS S3へのファイルのアップロードに使用するサービスがあります。私はgoroutinesで使用しようとしていて、ファイルをアップロードしていませんでした。goroutineなしでファイルをアップロードした場合は、完了するまで待機してから応答を返す必要があります。goroutineを使用すると、バックグラウンドで実行され、クライアント側への応答が速くなります。
goroutinesを使用すると、アップロードが失敗した場合はどうなりますか?そして、そのファイルはAWS S3にアップロードされていませんか?これをどのように扱うか教えてもらえますか?
これがファイルをアップロードする私の機能です
func uploadToS3(s *session.Session, size int64, name string , buffer []byte)( string , error) {
tempFileName := "pictures/" + bson.NewObjectId().Hex() + "-" + filepath.Base(name)
_, err := s3.New(s).PutObject(&s3.PutObjectInput{
Bucket: aws.String("myBucketNameHere"),
Key: aws.String(tempFileName),
ACL: aws.String("public-read"),
Body: bytes.NewReader(buffer),
ContentLength: aws.Int64(int64(size)),
ContentType: aws.String(http.DetectContentType(buffer)),
ContentDisposition: aws.String("attachment"),
ServerSideEncryption: aws.String("AES256"),
StorageClass: aws.String("INTELLIGENT_TIERING"),
})
if err != nil {
return "", err
}
return tempFileName, err
}
func UploadFile(db *gorm.DB) func(c *gin.Context) {
return func(c *gin.Context) {
file, err := c.FormFile("file")
f, err := file.Open()
if err != nil {
fmt.Println(err)
}
defer f.Close()
buffer := make([]byte, file.Size)
_, _ = f.Read(buffer)
s, err := session.NewSession(&aws.Config{
Region: aws.String("location here"),
Credentials: credentials.NewStaticCredentials(
"id",
"key",
"",
),
})
if err != nil {
fmt.Println(err)
}
go uploadToS3(s, file.Size, file.Filename, buffer)
c.JSON(200, fmt.Sprintf("Image uploaded successfully"))
}
}
5-10分あたり10000以上のファイルをアップロードする多くのリクエストがある場合はどうですか?リクエストが多すぎるため、一部のファイルをアップロードできませんか?
バックグラウンドのgo-routineでファイルをアップロードするなどの非同期タスクでchan error
は、呼び出し元にを返すような方法でアップロード関数を記述できます。その後、呼び出し元は、からの読み取りにより、後でファイルアップロードの最終的なエラー(またはエラーがない場合はnil)に対応できますchan error
。
ただし、アップロードリクエストを受け入れる場合は、代わりに、チャネル経由のファイルアップロードを受け入れるワーカーアップロードgo-routineを作成することをお勧めします。出力「エラー」チャネルは、成功/失敗を追跡できます。必要に応じて、アップロードされたエラーを元のアップロードチャネルキューに書き戻すことができます(再試行の集計と再試行の最大数を含む-問題のあるペイロードが永久にループしないため)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加