У меня есть серьезная проблема с 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
Так что в этот момент я действительно запутался:
- Почему я могу успешно открыть JPEG, а администратор не может?
- Я что-то упустил, разве это не проблема с libjpeg?
- Если нет проблем с 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 )