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

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

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

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, но я не уверен, как это проверить или исправить. Из-за чего мои загруженные изображения искажаются/повреждаются?


person Travis    schedule 21.01.2010    source источник
comment
Что вы подразумеваете под «искаженным»?   -  person Ben James    schedule 22.01.2010
comment
Добавил пример изображения в сообщение выше   -  person Travis    schedule 22.01.2010


Ответы (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.

person ChristopheD    schedule 21.01.2010
comment
Обоснование в книге Pylons для shutil.copyfileobj состоит в том, чтобы избегать загрузки очень больших файлов в память. Я также считаю, что .file.read() можно заменить на .value, но я все еще изучаю этот материал. - person Oddthinking; 14.04.2011
comment
О, и проверка работоспособности request.POST['image'].filename перед использованием кажется целесообразной. - person Oddthinking; 14.04.2011