web-dev-qa-db-fra.com

Aws s3 generate_presigned_url vs generate_presigned_post pour le téléchargement de fichiers

Je travaillais sur le téléchargement et le téléchargement d'un godet de fichier sur S3 à l'aide d'URLs pré-signés .J'ai rencontré ces deux méthodes generate_presigned_url('put_object') et generate_presigned_post.

Quelle est la différence entre ces deux méthodes?

# upload a file to a bucket with generate_presigned_url with put object
s3_client.generate_presigned_url('put_object', Params= {'Bucket': "BUCKET_NAME",
                                                        "Key":"OBJECT_KEY"},
                                                         ExpiresIn=3600)
  

# upload a file to a bucket using presigned post
s3_client.generate_presigned_post(Bucket="BUCKET_NAME", Key="OBJECT_PATH",
                                  ExpiresIn=3600)

Quelqu'un pourrait-il s'il vous plaît expliquer la différence entre les deux?

Si nous avons generate_presigned_post Pourquoi y avait-il un generate_presigned_url méthode avec put_object pour le téléchargement en premier lieu.

NOTE: Je sais que generate_presigned_post est la méthode recommandée pour les téléchargements de fichier et j'ai utilisé la même chose. Cependant, il n'y a pas de documentation claire sur la différence entre ces méthodes.

4
DineshKumar

Ceci est une version étendue du commentaire de @ Jellycsc. J'avais posté la même requête au support AWS. J'ai eu la réponse ci-dessous d'eux.

Une explication plus détaillée est donnée ici

Publier ici car cela pourrait être utile pour quelqu'un.

Quelle est la différence entre ces deux méthodes?

generate_presigned_post() est plus puissant à cause du POST stratégie Fonction POST La stratégie est simplement des conditions que vous avez définies. Lors de la création du post préigné. Utilisez-le, vous pouvez autoriser certains types de mime et les extensions de fichier, permettre à plusieurs fichiers à être téléchargés avec un préfixe donné, restreignez la taille du fichier, etc., ce qui n'est pas possible dans generate_presigned_url()

Veuillez noter que les deux méthodes peuvent être utilisées pour remplir le même objectif, c'est-à-dire une manière contrôlée pour les utilisateurs de télécharger des fichiers directement sur des godets S3. Le processus est également le même pour les deux que les besoins de contrôle de signer la demande après validation de la validation de l'autorisation de l'utilisateur, alors le navigateur envoie le fichier directement à S3.

Différences:

URLStructure:

Mettez des URL à tout encode dans l'URL elle-même car il n'y a rien d'autre que de retour au client. Cela signifie que moins de variables peuvent être personnalisées.

Les URL de poste utilisent plusieurs champs pour différents types d'informations. L'algorithme de signature renvoie une liste de champs avec l'URL elle-même et le client doit également envoyer ceux-ci à S3 tout en accédant à l'URL présigné.

Bien que les URL de mise fournissent une destination permettant de télécharger des fichiers sans autre pièce requise, =POST URL sont effectués pour des formulaires pouvant envoyer plusieurs champs. Cependant, leur utilisation n'est pas limitée aux formulaires.

Type de contenu

Pour les URL de mise, la signature doit être effectuée pour un type de contenu spécifique. Cela signifie que vous êtes sans égard un type de contenu sur le backend, par exemple, Application/XML si vous souhaitez autoriser les utilisateurs à télécharger des documents XML ou que le client doit envoyer le type de contenu souhaité dans le cadre de la demande de signature.

Pour POST URLS La stratégie prend en charge une contrainte de préfixe ainsi qu'une correspondance exacte.

Longueur de contenu:

En cas d'URL de mise, vous n'avez aucun contrôle sur la taille du fichier téléchargé.

Pour POST URL, vous pouvez définir une plage autorisée dans la stratégie.

Sample Post préigné dans Python:

response = s3_client.generate_presigned_post(Bucket="BUCKET_NAME",
                                                     Key="S3KEY",
                                                     Fields={"Content-Type": "image/jpg"},
                                                     Conditions=["starts-with", "$Content-Type", "image/"],
                                                     ExpiresIn=3600)
13
DineshKumar