2017-10-12 5 views
0

Je crée un à S3 fichier zip en mémoire et le téléchargement comme suit:fichier zip en mémoire télécharge un 0 B objet

def upload_script(s3_key, file_name, script_code): 
    """Upload the provided script code onto S3, and return the key of uploaded object""" 
    bucket = boto3.resource('s3').Bucket(config.AWS_S3_BUCKET) 
    zip_file = BytesIO() 
    zip_buffer = ZipFile(zip_file, "w", ZIP_DEFLATED) 
    zip_buffer.debug = 3 
    zip_buffer.writestr("{}.py".format(file_name), script_code) 
    for zfile in zip_buffer.filelist: 
     zfile.create_system = 0 
    zip_buffer.close() 
    upload_key = "{}/{}_{}.zip".format(s3_key, file_name, TODAY()) 
    print zip_buffer.namelist(), upload_key 
    bucket.upload_fileobj(zip_file, upload_key) 
    return upload_key 

L'impression et le retour des valeurs sont les suivantes pour une course d'essai:

['s_o_me.py'] a/b/s_o_me_20171012.zip 
a/b/s_o_me_20171012.zip 

le script de test est une simple ligne de python:

print upload_script('a/b', 's_o_me', "import xyz") 

les fichiers sont créés dans le seau S3, mais ils sont de 0 B taille. Pourquoi le tampon n'est-il pas écrit/téléchargé correctement?

Répondre

1

Apparemment, vous devez rechercher un 0e index dans l'objet BytesIO avant de procéder à d'autres opérations.

Modification de l'extrait à:

zip_file.seek(0) 
bucket.upload_fileobj(zip_file, upload_key) 

fonctionne parfaitement.