2017-05-15 3 views
1

Ce que je veux accomplir est de générer un lien pour voir le fichier (ex.image ou pdf). L'article n'est pas accessible par l'URL (https://[bucket].s3.amazonaws.com/img_name.jpg), je pense que c'est privé et non public? (Je ne suis pas le propriétaire du seau, mais il m'a donné access_key et secret_key?)Comment accéder à l'image par url sur s3 en utilisant boto3?

Pour l'instant, tout ce que je peux faire est de télécharger un fichier avec ce code.

s3.Bucket('mybucket').download_file('upload/nocturnes.png', 'dropzone/static/pdf/download_nocturnes.png') 

Je veux accéder à une image sur s3 donc je peux le mettre sur un HTML, puis-je voir en utilisant l'accès et la clé secrète ?. Merci pour ceux qui peuvent aider!

+0

S'il y a un volume élevé de trafic pour récupérer le fichier, don Ne faites pas cette récupération de fichier directe. – mootmoot

+0

@mootmoot pourquoi? et comment devrais-je faire une récupération? –

+0

Étudier l'option pour utiliser CDN. Parce que AWS facture 0,09 $/Go pour le transfert de données d'AWS qui n'utilise pas cloudfront. – mootmoot

Répondre

4

Vous pouvez accomplir ceci en utilisant une URL pré-signée en utilisant la fonction generate_presigned_url. La mise en garde est que les URL pré-signés doivent avoir une date d'expiration. Je n'ai pas pu trouver de documentation sur la durée maximale autorisée. Voici un exemple:

url = s3.generate_presigned_url('get_object', 
           Params={ 
            'Bucket': 'mybucket', 
            'Key': 'upload/nocturnes.png', 
           },         
           ExpiresIn=3600) 
print url 
+0

Merci, c'est ce que je cherchais. Je peux enfin mettre l'image de s3 sur mon site. Mais j'ai un nouveau problème, j'utilise une bibliothèque js (pdf.js) pour voir le fichier pdf d'amazon sur mon site. Mais il produit une "demande d'origine croisée bloquée: la même politique d'origine interdit la lecture de la ressource distante à ....." mais c'est une autre question, merci encore. –

+1

@jordanm Si vous êtes curieux, la durée maximale dans chaque région AWS est de 604800 secondes (7 jours). Les régions plus anciennes semblent prendre en charge les expirations au-delà de l'année 2038 si l'URL est signée avec Signature Version 2, mais 7 jours est la valeur qui fonctionne partout. Si l'ID de clé d'accès qui a signé l'URL est désactivé/supprimé, toutes les URL signées par cette clé deviennent également inutilisables. La rotation des clés d'accès étant une bonne pratique, les URL signées ne durent que tant que votre stratégie de rotation des clés le permet. –

0

Pour les personnes qui veulent utiliser generate_presigned_url pour un objet public et donc ne veulent pas faire la partie de signature qui ajoute des informations d'identification, la meilleure solution que je trouve est à toujours utiliser le generate_presigned_url , juste que le Client.Config.signature_version doit être réglé sur botocore.UNSIGNED.

Ce qui suit renvoie le lien public sans les éléments de signature.

config.signature_version = botocore.UNSIGNED 
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key}) 

Les discussions pertinentes sur le dépôt boto3 sont: