私はDjangoのPIL(Python Image Library)で大きな問題を抱えており、多くのフープを飛び越えて、これまでのところ問題の根本が何であるかを理解することができませんでした。
この問題は基本的に、Django管理者のImageFieldを介してJPEG画像をアップロードできないことに分類されます。しかし、問題はlibjpegのインストールほど単純ではありません。
まず、(Buildoutを介して)PILをインストールしましたが、インストールすると、JPEGサポートが利用できないためにlibjpegをインストールしていないことに気付きました。
サーバーを自分でセットアップしていなかったので、サーバーがインストールされていないと思い、ソースからlibjpeg8をコンパイルしました。これは私の/usr/ local /lib/ディレクトリに行き着きました。Buildoutファイルをクリアして、すべてを再構築しました。今回PILがコンパイルされたとき、私はJPEGをサポートしていました。しかし、私はDjango Adminに行き、運が悪かったImageFieldを介してJPEGをアップロードしようとしました。「有効な画像をアップロードしてください。アップロードしたファイルは画像ではないか、破損した画像でした」というエラーが表示されました。テストと同じように、私はDjanoシェルを開いて、次のように実行しました。
> import Image
> i = Image.open( "/absolute_path/file.jpg" )
> print i
<JpegImagePlugin.JpegImageFile image mode=RGB size=940x375 at 0x7F908C529BD8>
これはエラーなしで実行され、PILがJPEGを開くことができることを示しています。
いくつか読んだ後、私はこのスレッドに出くわします: apacheが使用するライブラリを制御することは可能ですか?
PHPもlibjpegを使用しており、Djangoの前にロードしているようです。そのため、libjpeg6.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
だから私の考えは、libjpeg6.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管理者でテストに行きます。まだ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
したがって、この時点で私は本当に混乱しています:
- 管理者ができないのになぜJPEGを正常に開くことができるのですか?
- 私は何かが足りないのですか、これはlibjpegの問題ではありませんか?
- libjpegに問題がない場合、問題なくPNGをアップロードできるのはなぜですか?
助けていただければ幸いです。私はこれを2日間続けており、運が悪かったのです。
セットアップ:1。Rackspace Cloud Server 2. Ubuntu 10.04 3. Django 1.2.3(ビルドアウトを介してインストール)4。PIL 1.1.7(ビルドアウトを介してインストール)5。libjpeg 6.2(aptitudeを介してインストール(sudo aptget install libjpeg62-dev)