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

Posted

技术标签:

【中文标题】为啥我不能通过 admin/ 将 jpg 文件上传到我的 Django 应用程序?【英文标题】:Why can't I upload jpg files to my Django app via admin/?为什么我不能通过 admin/ 将 jpg 文件上传到我的 Django 应用程序? 【发布时间】:2010-11-26 23:36:58 【问题描述】:

我正在尝试将图像添加到我的 Django 应用程序中的模型中。

models.py

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

在开发模式下,每次我尝试通过 Django admin 上传图片时,我都会收到:

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

我通过 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 文件。

【问题讨论】:

【参考方案1】:

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

这是我发现的一组说明,用于让 libjpeg 和 PIL 在 MacOS 上正常运行(请参阅最后;看起来您可能需要显式设置解码器的目录):

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

【讨论】:

【参考方案2】:

虽然在 Linux 而非 Mac 上,但我遇到了这个问题,因此可能无法提供太具体的信息。 但是,您可能也需要 libjpeg-devel(如果有 Mac 通讯员)。

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

【讨论】:

【参考方案3】:

只是做 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】:

我在 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

它对我有用,希望它对你有用。

【讨论】:

我也安装了枕头 - 安装 libjpeg-dev 后必须卸载/重新安装。 这对我不起作用。即使安装了 libjpeg-dev,在 virtualenv 中构建 PIL 仍然会报告“JPEG support not available”。 非常感谢!这个错误让我发疯。最新版本的 PIL,可以很好地从文件中读取相同的 jpeg,但绝不会从 StringIO 中读取!你的食谱一下子就把它治好了。 对 pip 安装的库进行更改后,是否需要重新启动服务器?还是别的什么?【参考方案5】:

Django 正在尝试从名为 PIL 的文件夹中导入 PIL,但 PIL 将自身安装在名为 e.g. 的文件夹中。 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 所述。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

请注意,对于在 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 上修复了错误。

【讨论】:

【参考方案9】:

我遇到了类似的问题,我已经通过参考以下链接解决了它:

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

【讨论】:

以上是关于为啥我不能通过 admin/ 将 jpg 文件上传到我的 Django 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的wordpress总是能上传所有类型文件?

为啥我不能下载用 PHP 上传的文件?

亿图图示为啥不能保存成jpg格式

C# Multipart/Form-Data:为啥 PDF 文件上传没有问题但 JPG 失败?

Django-Photologue:上传 jpg 文件时出现错误 500,但上传 png 文件有效

通过邮递员通过 API 使用 Rails 主动存储上传文件(.pdf、.jpg 等)? (不通过 Rails 视图)