我在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
所以在这一点上我真的很困惑:
任何帮助都会非常感激,我已经对此进行了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 )
答案 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的任何问题。