Maison  >  Article  >  développement back-end  >  Gérez les téléchargements de fichiers S3 sans manquer de ressources

Gérez les téléchargements de fichiers S3 sans manquer de ressources

WBOY
WBOYavant
2024-02-10 19:36:09903parcourir

处理 S3 文件下载而不耗尽资源

L'éditeur php Xinyi est là pour présenter un moyen efficace de gérer les téléchargements de fichiers S3 afin d'éviter d'épuiser les ressources du serveur. S3 est un service de stockage cloud évolutif fourni par Amazon, mais lorsqu'il s'agit de téléchargements de fichiers volumineux, les méthodes de téléchargement traditionnelles peuvent entraîner l'épuisement des ressources du serveur. Cet article présentera une solution basée sur PHP qui gère efficacement les téléchargements de fichiers S3 et améliore les performances du serveur et l'expérience utilisateur grâce aux téléchargements fragmentés et au streaming. Découvrons ensemble cette méthode !

Contenu de la question

J'ai une application go-gin qui permet de télécharger et de télécharger plusieurs types de fichiers dans S3.

Tous les fichiers avant d'être téléchargés sur s3 sont cryptés à l'aide d'AWS s3cryptoclient, d'AES GCM et des clés de KMS. Donc, en ce qui concerne le bucket s3, tout est binaire.

Je peux utiliser la commande getObject SDK pour télécharger le fichier sur le serveur et le décrypter, puis utiliser io.write(tempfile) pour transmettre ce fichier au client pour téléchargement.

Le problème ici est que S3 contient des fichiers d'une taille de 10 Go et que le serveur sera accessible par plusieurs utilisateurs chaque jour. Comme nous l'avons vu, l'écriture de fichiers temporaires sur un serveur doté de 16 Go de RAM peut également rapidement épuiser la mémoire, tout en étant également conscient du coût de fonctionnement d'un tel serveur.

Le goulot d'étranglement est que le fichier doit être déchiffré avant de pouvoir être servi. Dans ce cas d'utilisation, l'URL présignée S3 suffit, bien que le décryptage ne soit pas fourni par l'URL présignée s3, sauf s'il s'agit du cryptage effectué par le client. notre cas AWS Encryption est en cours de traitement, cette solution n'est donc pas réalisable.

Quelqu'un a-t-il des conseils ou des cas d'utilisation possibles pour résoudre ce problème où nous pouvons utiliser go-gin/NGINX pour écrire des fichiers directement sur le client.

Traitement des téléchargements de fichiers par l'utilisateur actuel

s3FileStream, _ := s3c.GetBucketItem(&utils.S3ObjectBucketInput{
    Bucket: "bucketName",
    Key:    "UserFileName"
})

fileBody, err := io.ReadAll(s3FileStream.Body)
if err != nil {
    panic(err.Error())
}

fileExtension := s3FileStream.Metadata["X-Amz-Meta-Type"]

err = ioutil.WriteFile("file" + *fileExtension, fileBody, 600) // temp file
if err != nil {
    panic(err.Error())
}
c.JSON(http.StatusCreated, string(fileBody))
c.Done()

}

Solution de contournement

Une option consiste à écrire l'objet directement sur le client en tant que corps de réponse :

s3FileStream, _ := s3c.GetBucketItem(&utils.S3ObjectBucketInput{
    Bucket: "bucketName",
    Key:    "UserFileName",
})
fileExtension := s3FileStream.Metadata["X-Amz-Meta-Type"]
c.DataFromReader(http.StatusCreated, 0, "application/data",
    s3FileStream.Body,
    map[string]string{"Content-Dispositon": "attachment; filename=" + "file" + *fileExtension})
c.Done()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer