0

J'ai une application Flask où j'essaie d'effectuer des opérations PIL/Pillow sur un fichier reçu de Flask-WTF -> Flask-Uploads, mais lorsque je sauvegarde le fichier, il me manque des octets et l'image n'est pas valide.Octets manquants après avoir fait une copie de l'image PIL à partir des données Flask-Uploads

Il semble même faire une copie de l'image sans opérations LIP supplémentaires résultats en corrompant le téléchargement d'origine:

@sights_blueprint.route('/add', methods=['GET', 'POST']) 
def add_image(): 
form = AddImageForm() 
if request.method == 'POST': 
    if form.validate_on_submit(): 

     # uploaded file 
     f = form.sights_image.data 
     filename = secure_filename(f.filename) 

     # PIL open + copy 
     img = Image.open(f).copy() 

     # save original file 
     f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 

Résultats dans:

original_file: 4622336 bytes 
saved_file:  886784 bytes 

Si je supprime img = Image.open(f).copy() le fichier téléchargé est enregistré correctement.

Si je ne ouvrir l'image avec PIL:

# PIL open (no copy) 
    img = Image.open(f) 

Le fichier sera également enregistrer correctement.

Mais si j'effectue une opération, une copie ou autre, le fichier enregistré résultant manque des octets et une image non valide.

Comment puis-je réaliser ce flux de travail?

+1

Je suppose que 'f' est un flux qui ne peut être lu qu'une seule fois. 'Image.open' ne lit pas dans l'image immédiatement, mais le' copy' le force à être consommé. –

Répondre

0

Lors de l'exécution sur le fichier ouvert avec PIL Image.open(f), le pointeur de fichier est avancé mais n'est pas réinitialisé avant d'écrire le fichier. Je pense que dans le cas de copy() le pointeur de fichier atteindrait la fin du fichier et aucun octet ne serait écrit, mais il ne semble pas basé sur mes écritures partielles précédentes. Dans tous les cas, la solution consiste à rembobiner le pointeur de fichier au début du fichier avant de l'enregistrer. Dans mon cas d'utilisation, il n'était pas nécessaire d'ouvrir une copie.

img = Image.open(f) 
# do some stuff to img 
f.seek(0) 
f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))