Comment faire pour télécharger un fichier S3 sans la création d'un local temporaire de fichier
Est-il possible de charger un fichier qui est généré dynamiquement à amazon s3 directement, sans d'abord créer un fichier local et ensuite télécharger sur le serveur s3? J'utilise python. Grâce
- Les réponses ci-dessous expliquent les deux façons de le faire. Mais si vous lancez jamais dans une API qui peut seulement prendre les fichiers, vous voudrez peut-être regarder à
tempfile.TemporaryFile
; avec les bons paramètres, vous obtenez un fichier, comme objet, comme près de n'être pas un fichier que possible. (Sur POSIX, ce qui signifie qu'il n'a pas d'entrée de répertoire et n'est pas sauvegardé sur le disque sauf en cas de nécessité; sur Windows, c'est en fait un objet wrapper autour d'un objet de fichier qui n'existe pas dans le répertoire temp jusqu'à ce que vous la fermez, ce qui n'est pas toujours assez bon, donc vous pouvez avoir à PyWin32CreateFile
et faire un peu plus de code compliqué à obtenir ce que vous voulez). - Au moment boto n'a pas de fonctionnalité pour ce. Le
Key.open_write()
méthode n'est pas encore mis en œuvre. Une fois que vous aurez la réponse.set_contents_from_stream()
aurait peut lire à partir d'un objet de flux de données, mais il fait s'attendre à un fichier... je ne sais pas si elle peut être utilisée en quelque sorte...
Vous devez vous connecter pour publier un commentaire.
Voici un exemple le téléchargement d'une image (à l'aide de demandes de la bibliothèque) et de l'envoyer à s3, sans l'écrire dans un fichier local:
Vous pouvez utiliser BytesIO de l'Python standard library.
La boto de la bibliothèque Clé objet a plusieurs méthodes que vous pourriez être intéressé par:
Pour un exemple d'utilisation de set_contents_from_string, voir Le Stockage Des Données section du boto documentation, collé ici par souci d'exhaustivité:
Je suppose que vous êtes en utilisant
boto
.boto
'sBucket.set_contents_from_file()
d'accepter unStringIO
objet, et tout le code que vous avez écrit pour écrire des données dans un fichier doit être facilement adaptable à écrire unStringIO
objet. Ou si vous générez une chaîne de caractères, vous pouvez utiliserset_contents_from_string()
.StringIO
objet comme je l'ai suggéré...file
vous pouvez passer ce juste, pas besoin de le lire en premier...Vous pouvez essayer d'utiliser
smart_open
(https://pypi.org/project/smart_open/). Je l'ai utilisé exactement pour ça: l'écriture de fichiers directement dans S3.J'ai eu un dict objet que je voulais stocker sous la forme d'un fichier json sur S3, sans la création d'un fichier local. Le code ci-dessous a fonctionné pour moi:
Donné que le chiffrement au repos, c'est beaucoup de données de votre choix norme maintenant, smart_open ne prend pas en charge ce autant que je sache