web-dev-qa-db-fra.com

téléchargement de fichier dans un dossier spécifique de S3 à l'aide de boto3

Tout avec mon code fonctionne. Le seul piège auquel je suis confronté actuellement est que je ne peux pas spécifier le dossier dans le compartiment S3 dans lequel je souhaite placer mon fichier. Voici ce que j'ai:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', filename)

J'ai essayé les deux:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>/folder/', filename)

et:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', '/folder/'+filename)

si quelqu'un a des conseils sur la façon de diriger cela vers un dossier spécifique (si cela est possible), s'il vous plaît faites le moi savoir!

10
Alex

Vous n'avez pas besoin de transmettre la valeur de clé sous forme de chemin absolu. Ce qui suit devrait fonctionner:

upload_file('/tmp/' + filename, '<bucket-name>', 'folder/{}'.format(filename))
22
hjpotter92

J'ai compris mon problème. J'ai eu la bonne idée avec l'option /folder/ dans la zone de paramètre clé, cependant, je n'avais pas besoin du premier / Merci à tous! C'est essentiellement la même idée que la suggestion de hjpotter92 ci-dessus.

3
Alex

Pour Python 3.x

s3.upload_file (chemin_fichier, nom du bucket, '% s /% s'% (bucket_folder, nom du fichier de destination))

0
Andrew Figaroa

Voici la méthode qui se chargera de la structure de répertoires imbriqués et sera capable de télécharger un répertoire complet en utilisant boto

def upload_directory():
    for root, dirs, files in os.walk(settings.LOCAL_SYNC_LOCATION):
        nested_dir = root.replace(settings.LOCAL_SYNC_LOCATION, '')
        if nested_dir:
            nested_dir = nested_dir.replace('/','',1) + '/'

        for file in files:
            complete_file_path = os.path.join(root, file)
            file = nested_dir + file if nested_dir else file
            print "[S3_UPLOAD] Going to upload {complete_file_path} to s3 bucket {s3_bucket} as {file}"\
                .format(complete_file_path=complete_file_path, s3_bucket=settings.S3_BUCKET, file=file)
            s3_client.upload_file(complete_file_path, settings.S3_BUCKET, file)
0
Suyash Soni