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

时间:2009-09-09 20:48:09

标签: python django

我正在尝试在我的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基于该会话有效。但是,它不会加载。 我尝试过其他jpgs,它们也不起作用。

可能出现什么问题?

我能够成功上传png文件。

9 个答案:

答案 0 :(得分:16)

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

这里有一套关于让libjpeg和PIL在MacOS上播放得很好的指令(看到最后;看起来你可能需要明确设置解码器的目录):

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

答案 1 :(得分: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

它对我有用,并希望它适合你。

答案 2 :(得分:2)

注意,对于在Ubuntu上使用virtualenv获得此错误的任何人,this帖子都很有帮助。

基本上,Ubuntu会将共享对象安装到pip不知道的位置。在这种情况下,pip期望系统库位于/ usr / lib中,但是Ubuntu将它们放在/ usr / lib / x86_64-linux-gnu或其他一些与architexture相关的位置。

短期解决方法是简单地将库符号链接到/ 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上的错误。

答案 3 :(得分: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,你就完成了

答案 4 :(得分:1)

我在Ubuntu 11.04上遇到了类似的问题。显然在Ubuntu 11中,似乎你需要libjpeg8-dev,而不是libjpeg或libjpeg62。感谢Guillaumes发表http://gpiot.com/ubuntu-9-10-install-pil-in-virtualenv/

答案 5 :(得分:0)

我有这个问题,虽然在Linux而不是Mac上,所以可能无法提供太具体的信息。 但是你也可能需要libjpeg-devel(如果有Mac的通讯员)。

还要确保完全从系统中清除当前的PIL安装。在确定正确安装了libjpeg之后,请使用build_ext -i重新安装PIL。然后运行PIL的selftest.py来检查它是否给出了JPEG错误。

答案 6 :(得分:0)

Django正试图从名为PIL的文件夹中导入PIL,但PIL会将自己安装在名为{1}的文件夹中。 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所述。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

我有类似的问题,我已经通过以下链接清除了它:

http://osqa.sjsoft.com/questions/96/why-is-there-no-jpegpng-decoder-when-i-pip-install-pil-on-ubuntu