用JPEG的Django ImageField问题

时间:2010-12-27 23:32:25

标签: django python-imaging-library libjpeg django-models

我在Django中遇到了PIL(Python图像库)的一个主要问题,并且已经跳过很多环节,到目前为止还没能弄清楚问题的根源是什么。

问题基本上分解为无法通过Django管理员中的ImageField上传JPEG图像。但问题并不像安装libjpeg那么简单。

首先,我安装了PIL(通过Buildout)并在安装后意识到我没有安装libjpeg,因为没有JPEG支持。

没有自己设置服务器,我只是假设它没有安装,我从源代码编译了libjpeg 8。这最终出现在我的 / usr / local / lib / 目录中。我清除了我的Buildout文件并重建了所有内容。这次PIL编译时我得到了JPEG支持。但我去了Django Admin并尝试通过ImageField上传JPEG而没有运气。我收到了“上传有效图片。您上传的文件不是图片或损坏的图片”错误。就像测试一样,我打开了一个Djano shell并运行了以下内容:

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

此操作没有错误,并显示PIL能够打开JPEG。

在做了一些阅读之后,我遇到了这个帖子: Is it possible to control which libraries apache uses?

看起来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。所以我删除了位于 / usr / local / lib 目录中的libjpeg。重新阅读PIL安装说明后,我意识到我可能没有PIL需要的libjpeg的dev / header文件。所以我也使用aptitude uninstaller( sudo aptitude remove libjpeg62 )卸载了libjpeg。然后为了确保我得到PIL需要的头文件我使用aptitude安装了libjpeg :( 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?
  4. 任何帮助都会非常感激,我已经对此进行了2天的调试而没有运气。

    设定:  1. Rackspace云服务器  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 个答案:

答案 0 :(得分:5)

去图,我会在发布后5分钟解决这个问题。我不确定真正的问题最终是什么,但这就是我解决它的方式。

自从使用aptitude安装libjpeg后,我开始尝试使用Aptitude而不是Buildout安装PIL。

我最终做的是:

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

然后我从Buildout中删除了PIL,重新构建了我的项目并且工作正常。既然PIL和libjpeg是通过Aptitude安装的,那么好像这解决了PIL找到libjpeg的任何问题。