Django ImageField проблема с JPEG - PullRequest
       21

Django ImageField проблема с JPEG

3 голосов
/ 28 декабря 2010

У меня есть серьезная проблема с PIL (Python Image Library) в Django, я перепрыгнул через множество обручей и до сих пор не смог выяснить, в чем корень проблемы.

Проблема по существу сводится к невозможности загрузки изображений JPEG через ImageField в администраторе Django. Но проблема не так проста, как установка libjpeg.

Сначала я установил PIL (через Buildout) и понял, что после его установки я не установил libjpeg, поскольку поддержка JPEG была недоступна.

Сам не настроив сервер, я просто предположил, что он не установлен, и скомпилировал libjpeg 8 из исходного кода. Это оказалось в моем каталоге / usr / local / lib / . Я очистил свои файлы Buildout и перестроил все. На этот раз при компиляции PIL у меня была поддержка JPEG. Но я пошел к администратору Django и попытался загрузить JPEG, хотя ImageField безуспешно. Я получил сообщение "Загрузить действительное изображение. Файл, который вы загрузили, не был изображением или поврежденным изображением". В качестве теста я открыл оболочку Djano и запустил следующее:

> import Image
> i = Image.open( "/absolute_path/file.jpg" )
> print i
<JpegImagePlugin.JpegImageFile image mode=RGB size=940x375 at 0x7F908C529BD8>

Это работает без ошибок и показывает, что PIL может открывать JPEG.

После прочтения я наткнулся на эту тему: Можно ли контролировать, какие библиотеки использует Apache?

Похоже, PHP также использует libjpeg и загружается до Django, а потому загружает libjpeg 6.2 раньше. Это шоу при использовании lsof :

COMMAND  PID     USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
apache2 2561 www-data mem    REG  202,1   146032 639276 /usr/lib/libjpeg.so.62.0.0

Так что я думаю, что я должен использовать libjpeg 6.2. Поэтому я удалил libjpeg, расположенный в моем каталоге / usr / local / lib . Перечитав инструкции по установке PIL, я понял, что у меня может не быть файлов dev / header для libjpeg, которые нужны PIL. Поэтому я также удалил libjpeg с помощью программы удаления aptitude ( sudo aptitude remove libjpeg62 ). Затем, чтобы убедиться, что я получил заголовочные файлы, необходимые для PIL, я установил libjpeg с помощью aptitude: ( sudo aptget install libjpeg62-dev ).

Отсюда я очистил свой каталог Buildout и перезапустил Buildout, который, в свою очередь, переустановил PIL. Еще раз, у меня есть поддержка JPEG, теперь использую libjpeg62.

Итак, я иду на тестирование в Django Admin. Все еще нет поддержки JPEG. Поэтому я хотел протестировать поддержку JPEG в целом и посмотреть, не было ли обработано исключение, какую ошибку он выдаст. Итак, в моей домашней странице я добавил следующий код, чтобы открыть изображение JPEG:

import Image
i = Image.open( "/absolute_path/file.jpg" )
v = i.verify()

Затем я передаю i в представление HTML, чтобы легко увидеть результат. Развернуть эти изменения на сервере и перезапустить. Я удивлен, что не вижу ошибки и получаю следующий вывод:

{{ i }} - <JpegImagePlugin.JpegImageFile image mode=RGB size=940x375 at 0x7F908C529BD8>
{{ v }} - None

Так что в этот момент я действительно запутался:

  1. Почему я могу успешно открыть JPEG, а администратор не может?
  2. Я что-то упустил, разве это не проблема с libjpeg?
  3. Если нет проблем с libjpeg, почему я могу загрузить PNG без проблем?

Любая помощь будет принята с благодарностью, я занимался этим 2 дня безуспешно.

Настройка: 1. Rackspace Cloud Server 2. Ubuntu 10.04 3. Django 1.2.3 (устанавливается через Buildout) 4. PIL 1.1.7 (устанавливается через Buildout) 5. libjpeg 6.2 (устанавливается через aptitude ( sudo aptget install libjpeg62-dev )

1 Ответ

5 голосов
/ 28 декабря 2010

Пойди разберись, что я бы решил это через 5 минут после публикации. Я не уверен, в чем заключалась настоящая проблема, но именно так я ее решил.

С момента установки libjpeg с помощью aptitude, я посмотрел на установку PIL с Aptitude, а не на Buildout.

То, что я закончил, было:

sudo apt-get install libjpeg62-dev
sudo apt-get install python-imaging

Затем я удалил PIL из своего Buildout, пересобрал свой проект, и он заработал. Теперь, когда PIL и libjpeg были установлены через Aptitude, кажется, что это решило любую проблему, с которой PIL обнаружил libjpeg.

...