为什么我不能通过admin上传jpg文件到我的Django应用程序?

17
我正在尝试在Django应用程序中的模型中添加图片。
models.py
class ImageMain(models.Model):
  product = models.ForeignKey(Product)
  photo = models.ImageField(upload_to='products')

在开发模式下,每次我尝试通过Django管理面板上传图片时,都会收到以下提示:

上传有效的图片。您上传的文件不是图像或损坏的图像。

我通过fink安装了libjpeg,然后在ox X 10.5.7上安装了PIL 1.1.6。

from PIL import Image
file = open('/Users/Bryan/work/review_app/media/lcdtvs/samsung_UN46B6000_front.jpg', 'r')
trial_image = Image.open(file)
trial_image.verify()

根据那个会话,jpg文件似乎是有效的。但是它没有加载。 我尝试了其他jpg文件,它们也无法工作。

可能出了什么问题呢?

我成功上传了一个png文件。

9个回答

16

我在Ubuntu服务器上遇到了同样的问题,你可以在安装PIL之前安装libjpeg-dev来解决它。

sudo apt-get install libjpeg-dev
sudo pip install PIL --upgrade

如果你已经在安装了PIL后安装了libjpeg-dev,则可以先卸载PIL,然后按照以下步骤重新安装PIL。

sudo pip uninstall PIL
sudo apt-get install libjpeg-dev
sudo pip install PIL

对我有效,希望对你也有效。


我也安装了Pillow - 在安装libjpeg-dev后不得不卸载/重新安装。 - stephendwolff
这对我没有用。即使安装了libjpeg-dev,在虚拟环境中构建PIL仍然报告“JPEG支持不可用”。 - Cerin
非常感谢!这个错误让我疯了。最新版本的PIL可以完美地从文件中读取相同的JPEG,但无论如何都无法从StringIO中读取!您的方法立即解决了它。 - Antony Hatchkins
在对pip安装的库进行更改后,需要重新启动服务器吗?还是需要执行其他操作? - Tony

16

2
请注意,对于在Ubuntu上使用虚拟环境出现此错误的任何人,这篇文章很有帮助。
基本上,Ubuntu将共享对象安装到pip不知道的位置。在这种情况下,pip期望系统库位于/usr/lib中,但Ubuntu将它们放在/usr/lib/x86_64-linux-gnu或其他架构相关位置。
短期解决方法是将库简单地符号链接到/usr/lib中:
sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/

这对我在Ubuntu 12.04上解决了错误。

1

只需执行
sudo easy_install PIL

这将安装特定于您的操作系统的PIL。 请确保在/usr/local/lib/python2.6/dist-packages/中生成的egg文件具有egg信息(因为当我执行相同操作时,egg文件不正确)。如果没有,请将PIL-build-specific-name重命名为PIL,并在dist-packages文件夹中添加一个PIL.pth文件。在PIL.pth文件中写入PIL,然后您就完成了


1

0
Django试图从名为PIL的文件夹中导入PIL,但是PIL会安装在名为PIL-1.1.7-py2.6-macosx-10.6-universal.egg的文件夹中,因此导入失败 - Django(或PIL?)似乎将其解释为损坏的图像。
一个简单的符号链接。
host:~ user$ cd /Library/Python/2.6/site-packages
host:site-packages user$ ln -vis PIL-1.1.7-py2.6-macosx-10.6-universal.egg PIL
create symbolic link `PIL' to `PIL-1.1.7-py2.6-macosx-10.6-universal.egg'

在我的Mac OSX 10.6.x MBP上,已经为我解决了这个问题。

在Linux机器上,文件夹可能被称为dist-packages,并位于/usr/lib/python/下面,但是思路是相同的。

通常可以在这里描述的位置找到安装Python模块的文件夹。


0

0

我曾经遇到过这个问题,虽然是在Linux上而不是Mac,所以可能无法提供太具体的信息。但是如果Mac有对应的话,您可能还需要安装libjpeg-devel。

另外,请确保从系统中完全清除当前的PIL安装。在确保libjpeg已正确安装后,使用build_ext -i重新安装PIL。然后运行PIL的selftest.py检查是否出现JPEG错误。


0

'python -v' 然后 'import _imaging' 对于找出 _imaging.so 加载自哪里很有用。如果您重新安装 PIL 而没有清除 site-packages 中的 PIL 目录,则可能仍在使用 Python 包目录下旧的 _imaging.so。PIL 的 selftest.py 将通过,因为您在构建目录中有一个新的 _imaging.so。并确保在 setup.py 中编辑 JPEG_ROOT 以在构建时选择正确的头文件和 .so 目录。


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