【问题标题】:Django ImageField issue with JPEG'sJPEG 的 Django ImageField 问题
【发布时间】:2010-12-27 23:32:24
【问题描述】:

我在 Django 中遇到了 PIL(Python 图像库)的一个主要问题,并且已经跳过了很多圈,到目前为止还无法弄清楚问题的根源是什么。

问题本质上分解为无法通过 Django 管理中的 ImageField 上传 JPEG 图像。但是问题并不像安装libjpeg那么简单。

首先,我安装了 PIL(通过 Buildout),安装后发现我没有安装 libjpeg,因为 JPEG 支持不可用。

我自己没有设置服务器,我只是假设它没有安装,我从源代码编译了 libjpeg 8。这最终出现在我的 /usr/local/lib/ 目录中。我清除了我的 Buildout 文件并重建了所有内容。这次当 PIL 编译时,我有 JPEG 支持。但是我去了 Django Admin 并尝试通过 ImageField 上传 JPEG,但没有成功。我收到“上传有效图片。您上传的文件不是图片或损坏的图片”错误。作为一个测试,我打开了一个 Djano shell 并运行了以下命令:

> import Image
> i = Image.open( "/absolute_path/file.jpg" )
> print i
<JpegImagePlugin.JpegImageFile image mode=RGB size=940x375 at 0x7F908C529BD8>

这运行没有错误,表明 PIL 能够打开 JPEG。

在阅读了一些内容之后,我遇到了这个线程: Is it possible to control which libraries apache uses?

看起来 PHP 也使用 libjpeg 并且在 Django 之前加载,因此之前加载 libjpeg 6.2。这是使用 lsof 时显示的:

COMMAND  PID     USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
apache2 2561 www-data mem    REG  202,1   146032 639276 /usr/lib/libjpeg.so.62.0.0

所以我的想法是我应该使用 libjpeg 6.2。所以我删除了位于我的 /usr/local/lib 目录中的 libjpeg。重新阅读 PIL 安装说明后,我意识到我可能没有 PIL 需要的 libjpeg 的 dev/header 文件。所以我还使用 aptitude 卸载程序(sudo aptitude remove libjpeg62)卸载了 libjpeg。然后,为了确保获得 PIL 需要的头文件,我使用 aptitude 安装了 libjpeg:(sudo aptget install libjpeg62-dev)。

从这里我清理了我的 Buildout 目录,然后重新运行 Buildout,它又重新安装了 PIL。再次,我有 JPEG 支持,现在使用 libjpeg62。

所以我去 Django Admin 中进行测试。仍然不支持JPEG。所以我想测试一下对 JPEG 的支持,看看异常是否没有被处理,会抛出什么样的错误。所以在我的主页视图中,我添加了以下代码来打开 JPEG 图像:

import Image
i = Image.open( "/absolute_path/file.jpg" )
v = i.verify()

然后我将 i 传递给 HTML 视图,以便轻松查看输出。我将这些更改部署到服务器并重新启动。我很惊讶没有看到错误并得到以下输出:

{{ i }} - <JpegImagePlugin.JpegImageFile image mode=RGB size=940x375 at 0x7F908C529BD8>
{{ v }} - None

所以在这一点上我真的很困惑:

  1. 为什么我可以成功打开 JPEG 而管理员却不能?
  2. 我错过了什么吗,这不是 libjpeg 的问题吗?
  3. 如果 libjpeg 没有问题,为什么我可以上传没有问题的 PNG?

任何帮助将不胜感激,我已经为此调试了 2 天,但没有运气。

设置: 1. Rackspace 云服务器 2. Ubuntu 10.04 3. Django 1.2.3(通过 Buildout 安装) 4. PIL 1.1.7(通过 Buildout 安装) 5. libjpeg 6.2(通过aptitude安装(sudo aptget install libjpeg62-dev

【问题讨论】:

    标签: django python-imaging-library libjpeg django-models


    【解决方案1】:

    想想,我会在发布后 5 分钟解决这个问题。我不确定真正的问题最终是什么,但这就是我解决它的方法。

    由于使用 aptitude 安装 libjpeg,我考虑使用 Aptitude 而不是 Buildout 安装 PIL。

    我最终做的是:

    sudo apt-get install libjpeg62-dev
    sudo apt-get install python-imaging
    

    然后我从我的 Buildout 中删除了 PIL,重新构建了我的项目并且它工作了。现在 PIL 和 libjpeg 是通过 Aptitude 安装的,这似乎解决了 PIL 找到 libjpeg 时遇到的任何问题。

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2013-06-07
      • 2012-06-05
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多