Pylons, загружающие искаженные изображения в Windows

Я создаю веб-приложение в Pylons и работаю над действием загрузки изображений. В настоящее время это выполняется с использованием egg:paste#http на моем компьютере с Windows, в базовой конфигурации разработки, описанной в кратком обзоре документации по pylons.

Когда я размещаю изображение в своем приложении, затем перемещаю изображение в корневой веб-каталог, а затем вытягиваю загруженное изображение в браузер, изображение выглядит искаженным. Это то, что я получил, когда загрузил GIF из Yahoo! логотип, но большинство файлов вообще не отображаются в браузере, предположительно из-за повреждения:

http://www.freeimagehosting.net/uploads/d2c92aef00.png

Это основной код, с которым я работаю (прямо из документации по пилонам):

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'] является объектом cgi.FieldStorage. Я думал, что это может быть проблемой с окончаниями строк Windows, но я не уверен, как это проверить или исправить. Что вызывает искажение / повреждение моих загруженных изображений?

1 ответ

Решение

Возможно, вам просто не хватает флага 'b' (двоичного) для эффективной записи файла в двоичном виде:

save_file = open(os_path, 'wb')

Но я не понимаю, зачем тебе shutil.copyfileobj позвоните туда, почему бы не сделать что-то вроде этого:

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

Или сделайте последние три строки чуть более питоническими (убедитесь, что дескриптор файла закрывается, даже если запись не удалась):

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

Возможно, вам нужен

from __future__ import with_statements

вверху вашего файла, если вы ниже Python 2.6.

Другие вопросы по тегам