2010-01-21 12 views
2

Je crée une application Web dans Pylons et je travaille sur une action de téléchargement d'images. Cela fonctionne actuellement en utilisant egg: paste # http sur ma machine Windows, dans la configuration de développement de base décrite dans le quickstart de la documentation pylons.Pylônes Téléchargement d'images déformées sous Windows

Lorsque je POSTE une image dans mon application, puis déplacez l'image vers le répertoire racine Web, puis tirez l'image téléchargée vers le haut dans le navigateur, l'image apparaît déformée. C'est ce que j'ai eu quand j'ai téléchargé un GIF de Yahoo! logo, mais la plupart des fichiers ne se présentent pas dans le navigateur du tout, probablement à cause de la corruption:

distorted yahoo logo http://www.freeimagehosting.net/uploads/d2c92aef00.png

Voici le code de base que je travaille avec (de la documentation Pylônes droite):

os_path = os.path.join(config.images_dir, request.POST['image'].filename) 
save_file = open(os_path, 'w') 
shutil.copyfileobj(request.POST['image'].file, save_file) 
request.POST['image'].file.close() 
save_file.close() 

request.POST ['image'] est un objet cgi.FieldStorage. Je pensais que cela pouvait être un problème avec les terminaisons de ligne Windows, mais je ne suis pas sûr de savoir comment vérifier ou corriger cela. Qu'est-ce qui cause la distorsion/la corruption des images téléchargées?

+0

Que voulez-vous dire par «déformé»? –

+0

Ajouté un exemple d'image au poste ci-dessus – Travis

Répondre

3

Vous probablement manque le « b » (binaire) drapeau pour écrire efficacement le fichier en tant que binaire:

save_file = open(os_path, 'wb') 

Mais je ne vois pas pourquoi vous avez besoin shutil.copyfileobj appel là-bas, pourquoi ne pas faire quelque chose comme ceci:

file_save_path = os.path.join(config.images_dir, request.POST['image'].filename) 
file_contents = request.POST['image'].file.read() 

# insert sanity checks here... 

save_file = open(file_save_path, 'wb') 
save_file.write(file_contents) 
save_file.close() 

Ou faire les trois dernières lignes un peu plus pythonique (en vous assurant la poignée de fichier est fermé, même si l'écriture échoue):

with open(file_save_path, 'wb') as save_file: 
    save_file.write(file_contents) 

Il est possible que vous avez besoin d'un

from __future__ import with_statements 

en haut de votre fichier si vous êtes en dessous de Python 2.6.

+0

Merci, cela fonctionne parfaitement. – Travis

+0

La justification dans le livre Pylons pour 'shutil.copyfileobj' est d'avoder de très gros fichiers dans la mémoire. Je crois aussi que '.file.read()' peut être remplacé par '.value', mais j'apprends toujours ce genre de choses. – Oddthinking

+0

Oh, et la vérification de la santé 'request.POST ['image']. Filename' avant l'utilisation semble souhaitable. – Oddthinking