为啥我不能通过 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 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
C# Multipart/Form-Data:为啥 PDF 文件上传没有问题但 JPG 失败?