web-dev-qa-db-fra.com

Comment télécharger un fichier sur S3 et le rendre public à l'aide de boto3?

Je suis capable de télécharger un fichier image en utilisant:

s3 = session.resource('s3')
bucket = s3.Bucket(S3_BUCKET)
bucket.upload_file(file, key)

Cependant, je veux aussi rendre le fichier public. J'ai essayé de rechercher certaines fonctions pour définir ACL pour le fichier, mais il semble que boto3 ait modifié son API et supprimé certaines fonctions. Y a-t-il un moyen de le faire dans la dernière version de boto3?

36
Adi

J'ai été capable de le faire en utilisant l'API objectAcl:

s3 = boto3.resource('s3')
object_acl = s3.ObjectAcl('bucket_name','object_key')
response = object_acl.put(ACL='public-read')

Pour plus de détails: http://boto3.readthedocs.io/en/latest/reference/services/s3.html#objectacl

30
Adi

Pour télécharger et définir une autorisation de lecture publique en une seule étape, vous pouvez utiliser:

bucket.upload_file(file, key, ExtraArgs={'ACL':'public-read'})

54
Bill Baker

à la manière d'Adi fonctionne. Cependant, si vous étiez comme moi, vous pourriez avoir un problème d'accès refusé. Cela est normalement dû à des autorisations brisées de l'utilisateur. Je l'ai corrigé en ajoutant ce qui suit au tableau Action:

"s3:GetObjectAcl",
"s3:PutObjectAcl"
4
Rohan Bagchi