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.