2009-09-09 28 views
17

我想在我的Django应用程序中将图像添加到我的模型中。为什么我不能通过管理员将jpg文件上传到我的Django应用程序?

models.py

class ImageMain(models.Model): 
    product = models.ForeignKey(Product) 
    photo = models.ImageField(upload_to='products') 

在发展模式,每次我试图上传通过Django管理的图像时,我不断收到:

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

我通过Fink安装的libjpeg然后在牛X 10.5.7

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有效基于该会话安装PIL 1.1.6。但是,它不会加载。 我尝试了其他jpgs,它们也不工作。

可能会出现什么问题?

我能够成功上传PNG文件。

回答

17

您是否已经在系统上编译/安装PIL之后安装了libjpeg?也许它无法正确找到解码器?

这里有一组的指示,我在得到的libjpeg和PIL在Mac OS很好地发挥中发现(见接近尾声,看起来你可能需要明确设置解码器的目录):

http://djangodays.com/2008/09/03/django-imagefield-validation-error-caused-by-incorrect-pil-installation-on-mac/

+0

我没有安装的libjpeg第一。 – BryanWheelock 2009-09-09 22:55:43

0

虽然在Linux上不是Mac,但我遇到了这个问题,因此可能无法提供特定的信息。 但是,您也可能需要libjpeg-devel(如果Mac上有通讯记录)。

此外请务必从系统中彻底清除您当前的PIL安装。在确定libjpeg已正确安装后,使用build_ext -i重新安装PIL。然后运行PIL的selftest.py来检查它是否会给出JPEG错误。

1

只是做
须藤的easy_install PIL

这将安装PIL具体到你的操作系统。 请确保在/usr/local/lib/python2.6/dist-packages/中生成的蛋文件有蛋信息(因为当我做同样的事情时,蛋文件不正确)。如果没有,那么只需将PIL-build-specific-name重命名为PIL,然后在dist-packages文件夹中添加一个PIL.pth文件。在PIL.pth文件中写入PIL,你就完成了

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 

它适合我,并希望它适合你。

+0

我还安装了枕头 - 并且在安装libjpeg-dev后不得不卸载/重新安装。 – stephendwolff 2012-09-10 08:44:06

+0

这不适合我。即使安装了libjpeg-dev,在virtualenv中构建PIL仍会报告“JPEG支持不可用”。 – Cerin 2012-10-24 15:47:08

+0

非常感谢!这个错误让我很生气。最新版本的PIL,从文件中读取相同的jpeg非常好,但绝不是来自StringIO!你的食谱马上治愈。 – 2012-11-13 10:09:05

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模块通常安装到的文件夹,如here所述。

0

'python -v'然后'import _imaging'对于确定从哪里加载_imaging.so是很有用的。如果重新安装PIL而不清除站点包中的PIL目录,则可能仍然使用Python包dir下的旧_imaging.so运行。 PIL的selftest.py会通过,因为你在你的构建目录中有一个新的_imaging.so。并且确保在编译时在setup.py中编辑JPEG_ROOT以获取正确的头文件和.so目录。

2

请注意,对于任何人在Ubuntu上使用virtualenv获取此错误,this文章是有帮助的。

基本上,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。

相关问题