让Django识别PIL JPEG支持

6
我正在使用Django 1.4PIL 1.1.7在由pip管理的virtualenv中运行。每当我通过我的管理界面上传JPEG文件时,就会出现以下错误:上传有效图像。您上传的文件不是图像或损坏的图像。 正如许多Ubuntu用户所报告的那样,在安装时,PIL错误地在/usr/lib/中查找libjpeg,而其真实位置在/usr/lib/i386-linux-gnu/中。我已经解决了这个问题;我按照这些帖子中的答案进行操作: Django ImageField "Upload a valid image. The file you uploaded was either not an image or a corrupted image." Why can't I upload jpg files to my Django app via admin/? 现在安装的最终输出如下:
PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version       1.1.7
platform      linux2 2.7.3 (default, Apr 20 2012, 22:44:07)
              [GCC 4.6.3]
--------------------------------------------------------------------
--- TKINTER support available
--- JPEG support available
--- ZLIB (PNG/ZIP) support available
--- FREETYPE2 support available
*** LITTLECMS support not available
--------------------------------------------------------------------
To add a missing option, make sure you have the required
library, and set the corresponding ROOT variable in the
setup.py script.

To check the build, run the selftest.py script.
changing mode of build/scripts-2.7/pilfile.py from 644 to 755
changing mode of build/scripts-2.7/pilfont.py from 644 to 755
changing mode of build/scripts-2.7/pilconvert.py from 644 to 755
changing mode of build/scripts-2.7/pilprint.py from 644 to 755
changing mode of build/scripts-2.7/pildriver.py from 644 to 755

changing mode of /usr/local/bin/pilfile.py to 755
changing mode of /usr/local/bin/pilfont.py to 755
changing mode of /usr/local/bin/pilconvert.py to 755
changing mode of /usr/local/bin/pilprint.py to 755
changing mode of /usr/local/bin/pildriver.py to 755
Successfully installed PIL

然而,Django仍然不允许我上传除BMP文件以外的其他文件,这对于这个项目是不可接受的。与第二个链接中的用户不同,我没有使用Apache,所以我的问题可能与此无关。我怀疑Django仍在使用旧版PIL。问题是我不知道它可能从哪里获取。对我来说,~/.virtualenvs/project/local/lib/python2.7/site-packages目录中的文件似乎是最新的。有任何想法吗?
编辑1:还要注意,我已经尝试退出并重新登录管理员,并安装了pillow,就像在这篇文章中所述:Uploading a JPEG image via Django displays error

2
运行 manage.py shell 并尝试类似于 import Image; im = Image.open("file.jpg"); im.show() 的操作,以查看其是否有效。 - jterrace
另外,我应该让你知道,我不是唯一在这个项目上工作的人。另一个使用 Mac OS X 系统的用户,在 PIL 和 Django 之间没有遇到任何问题。 - novembrine
@jterrace:啊哈!它没起作用。这是输出: Traceback (most recent call last): File "<console>", line 1, in <module> File "/home/sionydus/.virtualenvs/django_are_news/local/lib/python2.7/site-packages/PIL/Image.py", line 1952, in open fp = builtin.open(fp, "rb") IOError: [Errno 2] No such file or directory: 'file.jpg' - novembrine
@novembrine 确认您的PIL安装已经支持JPEG格式。 - jterrace
2
可能你的系统中有多个PIL。尝试运行以下代码: >>> import Image >>> Image.__file__ '/usr/lib/python2.6/site-packages/PIL/Image.pyc' 查看你正在导入哪一个。 - Meitham
显示剩余14条评论
1个回答

2
事实证明,这整个问题都是由于我对 pip 的实际工作方式存在误解所致。习惯上,我将所有安装都与超级用户权限相关联,但在这种情况下不仅没有必要,而且会导致混淆。
第一次安装 PIL 时,我没有使用 sudo 前缀,但每次之后都使用了。因此,根据 Meitham 的建议,我检查了导入的位置。它来自正确的位置,但是尽管安装后的输出显示我有所需的扩展,但它并没有。长话短说,我从我的 site-packages 目录中删除了该目录,然后 pip freeze 继续告诉我没有 PIL,但 sudo pip install 却告诉我已经安装了。
教训: virtualenv 基于用户目录和用户权限。在同一命令中结合使用 sudopip 之前请三思。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接