Télécharger des images et des métadonnées public compartiment Amazon S3 avec Python demandes
-
21-12-2019 - |
Question
Je sais, il y a le nom de boto bibliothèque pour Python, cependant, tout ce que je souhaite faire c'est de téléchargement d'un lot de fichiers image, y compris les métadonnées à un public compartiment S3.Les images devraient aller dans les différents sous-répertoires à l'intérieur du seau.
Avec cURL, c'est censé être au travail:
curl -v -F "key=test/test.jpg" -F "file=@test.jpg" http://my-public-bucket.s3.amazonaws.com/
Donc je me dis que devrait être faisable avec urllib, urllib2 et/ou Python demandes seulement.Mais comment?Je suis totalement nouveau pour Amazon S3 ...et cURL.
Aussi quelle est la meilleure façon de stocker certaines méta-données avec les images?Un supplément de JSON-chaîne de fichier?
La solution
Votre chaîne de courbure se traduit par approximativement ce qui suit:
import requests
url = 'http://my-public-bucket.s3.amazonaws.com/'
files = {
'key': ('', 'test/test.jpg'),
'file': open('test.jpg', 'rb'),
}
r = requests.post(url, files=files)
La forme générale des demandes de la syntaxe de téléchargement de plusieurs demandes est trouvée dans Cette réponse de Stackoverflow répond .
Autres conseils
À l'aide de boto
(version 2.6.0) vous auriez du faire comme ceci:
import boto
connection = boto.connect_s3()
bucket = connection.get_bucket('mybucket')
key = bucket.new_key('myimage.jpg')
key.set_contents_from_filename('myimage.jpg')
key.set_metadata(...)
Assurez-vous que vous avez les informations d'identification dans les variables d'environnement AWS_ACCESS_KEY_ID
et AWS_SECRET_ACCESS_KEY
.
C'est tout.
fonctionne avec des demandes Python uniquement:
import requests
r = requests.post('my_public_bucket', files={'file': open('/path/test.txt', 'rb')}, data={'key': 'test/test.txt'})
Télécharger sur une URL signée et des demandes que je devais faire ceci:
with open('photo_1.jpg', 'rb') as content_file:
content = content_file.read()
result = requests.put(url=upload_url, headers={}, data=content)
C'est mauvais car il charge tout en mémoire, mais il devrait vous faire dépasser la bosse initiale.
Aussi lorsque vous utilisez CURL, j'ai dû utiliser l'option différente:
curl -X PUT --upload-file photo_1.jpg <url>
Remarque: lorsque j'ai créé l'URL sur mon serveur avec Boto, je définis les en-têtes= aucun pour que les en-têtes ne soient pas un problème.