2 Stimmen

Pylonen Hochladen verzerrter Bilder unter Windows

Ich erstelle gerade eine Web-App in Pylons und arbeite an einer Bild-Upload-Aktion. Dies läuft derzeit mit egg:paste#http auf meinem Windows-Rechner in der grundlegenden Entwicklungskonfiguration, die in der Pylons-Dokumentation Quickstart beschrieben wird.

Wenn ich ein Bild in meine Anwendung POSTe, dann das Bild in das Web Root-Verzeichnis verschiebe und dann das hochgeladene Bild im Browser aufrufe, erscheint das Bild verzerrt. Das ist, was ich bekam, als ich ein GIF des Yahoo!-Logos hochgeladen habe, aber die meisten Dateien werden im Browser überhaupt nicht angezeigt, vermutlich wegen der Beschädigung:

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

Dies ist der grundlegende Code, mit dem ich arbeite (direkt aus der Pylonen-Dokumentation):

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'] ist ein cgi.FieldStorage-Objekt. Ich dachte, es könnte sich um ein Problem mit Windows-Zeilenenden handeln, aber ich bin nicht sicher, wie ich das überprüfen oder korrigieren kann. Woran liegt es, dass meine hochgeladenen Bilder verzerrt/beschädigt sind?

3voto

ChristopheD Punkte 106139

Wahrscheinlich fehlt Ihnen nur das Flag 'b' (binary), um die Datei tatsächlich als Binärdatei zu schreiben:

save_file = open(os_path, 'wb')

Aber ich verstehe nicht, warum Sie die shutil.copyfileobj Warum nicht so etwas tun?

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()

Oder machen Sie die letzten drei Zeilen etwas pythonischer (stellen Sie sicher, dass das Dateihandle geschlossen wird, auch wenn der Schreibvorgang fehlschlägt):

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

Es ist möglich, dass Sie eine

from __future__ import with_statements

am Anfang Ihrer Datei, wenn Sie unter Python 2.6 arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X