У меня есть сервис, который использует для загрузки файла на AWS S3 . Я пытался использовать с goroutines и без загрузки файла. Если я загружаю файл без подпрограмм, он должен подождать до конца, а затем дать ответ, и если я использую подпрограммы, он будет работать в фоновом режиме и быстрее реагировать на клиентскую сторону.
Как насчет того, чтобы загрузитьне удалось, если я использую 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"))
}
}
Я тоже подумал, а как насчет того, если есть много запросов на загрузку файла более 10000+ за 5-10 минут? какой-то файл не может быть загружен из-за слишком большого количества запросов?