I am running Django 1.4
and PIL 1.1.7
in a virtualenv
managed with pip
. Whenever I upload a JPEG file via my admin interface, I get the following error: Upload a valid image. The file you uploaded was either not an image or a corrupted image.
As many Ubuntu users have reported, on installation, PIL erronously looked in /usr/lib/
for libjpeg
, while its true location was in /usr/lib/i386-linux-gnu/
. That's taken care of; I followed the answers in these posts:
Django ImageField "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
Why can't I upload jpg files to my Django app via admin/?
Now the final output of installation looks as follows:
PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version 1.1.7
platform linux2 2.7.3 (default, Apr 20 2012, 22:44:07)
[GCC 4.6.3]
--------------------------------------------------------------------
--- TKINTER support available
--- JPEG support available
--- ZLIB (PNG/ZIP) support available
--- FREETYPE2 support available
*** LITTLECMS support not available
--------------------------------------------------------------------
To add a missing option, make sure you have the required
library, and set the corresponding ROOT variable in the
setup.py script.
To check the build, run the selftest.py script.
changing mode of build/scripts-2.7/pilfile.py from 644 to 755
changing mode of build/scripts-2.7/pilfont.py from 644 to 755
changing mode of build/scripts-2.7/pilconvert.py from 644 to 755
changing mode of build/scripts-2.7/pilprint.py from 644 to 755
changing mode of build/scripts-2.7/pildriver.py from 644 to 755
changing mode of /usr/local/bin/pilfile.py to 755
changing mode of /usr/local/bin/pilfont.py to 755
changing mode of /usr/local/bin/pilconvert.py to 755
changing mode of /usr/local/bin/pilprint.py to 755
changing mode of /usr/local/bin/pildriver.py to 755
Successfully installed PIL
However, Django still doesn't allow me to upload anything but BMP files, which is not acceptable for this project. Unlike the user in the second link, I'm not using Apache, so my problem is probably not related. My suspicion is that Django is still using an old installation of PIL. The problem is that I don't know where it could be getting it from. The files in ~/.virtualenvs/project/local/lib/python2.7/site-packages
seem up-to-date to me. Any ideas?
EDIT 1: Also note that I have tried logging out and logging back in the admin, as well as installing pillow
, as in this post: Uploading a JPEG image via Django displays error
It turns out that this whole thing is my fault due to a misunderstanding of how pip
actually works. By habit, I associate any and all installations with superuser privileges, which was not only not necessary in this case, but a recipe for confusion.
The first time I installed PIL
, I did not prefix it with sudo
, but I did each time after. Thus, building from Meitham's advice, I checked to see where the import was coming from. It came from the correct place, but it did not have the extensions I desired, despite the post-installation output saying I did. Long story short, I removed the directory from my site-packages, then pip freeze
continued to tell me I did not have PIL
but sudo pip install
told me I did.
Lesson learned: virtualenv
is based in the user's directory, on the user's privileges. Think twice before combining sudo
and pip
in the same command.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With