2009-09-09 18 views
17

Sto provando ad aggiungere immagini ai miei modelli nella mia app Django.Perché non posso caricare file jpg nella mia app Django tramite admin /?

models.py

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

In modalità di sviluppo, ogni volta che cerco di caricare l'immagine tramite Django admin, continuo a ricevere:

Carica un'immagine valida. Il file che hai caricato non era un'immagine o un'immagine corrotta.

ho installato libjpeg via fink e poi installato PIL 1.1.6 sul bue X 10.5.7

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() 

Sembra che il jpg è valida sulla base di quella sessione. Tuttavia, non viene caricato. Ho provato altri jpg, anche loro non funzionano.

Cosa potrebbe andare storto?

Sono riuscito a caricare correttamente un file png.

risposta

17

Si è installato libjpeg dopo che il PIL è già stato compilato/installato nel sistema? Forse non riesce a trovare il decodificatore correttamente?

Ecco una serie di istruzioni che ho trovato su come ottenere libjpeg e PIL giocare bene su MacOS (vedere verso la fine, sembra che potrebbe essere necessario impostare in modo esplicito il dir del decoder):

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

+0

ho fatto installare libjpeg prima. – BryanWheelock

0

Ho avuto questo problema anche se su Linux non Mac, quindi potrebbe non essere in grado di fornire informazioni troppo specifiche. Tuttavia potrebbe essere necessario anche libjpeg-devel (se c'è un corrispondente per Mac).

Assicurarsi inoltre di eliminare completamente l'installazione PIL corrente dal sistema. E dopo esserti assicurato che libjpeg sia installato correttamente, reinstallare il PIL con build_ext -i. Quindi eseguire il comando selftest.py di PIL per verificare se fornisce l'errore JPEG.

1

solo fare
sudo easy_install PIL

questo installerà PIL specifici per il vostro sistema operativo. assicurati che il file egg generato in /usr/local/lib/python2.6/dist-packages/ abbia informazioni sull'uovo (perché quando ho fatto lo stesso, il file egg non era corretto). In caso contrario, rinominare PIL-build-specific-name in PIL e aggiungere un file PIL.pth nella cartella dist-packages. scrivi PIL nel file PIL.pth e hai finito

16

Ho incontrato lo stesso problema nel server Ubuntu, quindi puoi correggerlo installando libjpeg-dev prima di PIL.

sudo apt-get install libjpeg-dev 
sudo pip install PIL --upgrade 

e se è già installato libjpeg-dev dopo PIL. quindi è possibile rimuovere prima PIL e provare a reinstallare PIL come segue.

sudo pip uninstall PIL 
sudo apt-get install libjpeg-dev 
sudo pip install PIL 

Funziona per me e spero che funzioni per voi.

+0

Ho anche installato il cuscino e ho dovuto disinstallare/reinstallare dopo aver installato libjpeg-dev. – stephendwolff

+0

Questo non ha funzionato per me. Anche con libjpeg-dev installato, la compilazione di PIL in una virtualenv riporta ancora "Supporto JPEG non disponibile". – Cerin

+0

Grazie mille! Questo errore mi stava facendo impazzire. L'ultima versione di PIL, legge lo stesso jpeg dal file perfettamente, ma in nessun modo da StringIO! La tua ricetta lo ha risolto subito. –

0

Django sta tentando di importare PIL da una cartella denominata PIL, ma PIL si installa in una cartella denominata ad es. PIL-1.1.7-py2.6-macosx-10.6-universal.egg, quindi l'importazione non riesce - quale Django (o PIL?) Sembra interpretare come immagine corrotta.

Un semplice link simbolico

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' 

ha risolto questo per me su un Mac OSX 10.6.x MBP. Su macchine Linux, la cartella potrebbe invece chiamarsi dist-packages e trovarsi al di sotto di /usr/lib/python/ o giù di lì, ma l'idea è la stessa.

Spesso è possibile trovare la cartella in cui i moduli python vengono normalmente installati come descritto here.

0

'python -v' quindi 'importare _imaging' è utile per capire da dove viene caricato _imaging.so. Se si reinstalla il PIL senza pulire la directory PIL nei pacchetti del sito, si può ancora essere in esecuzione con un vecchio _imaging.so nella directory del pacchetto Python. Passerà selftest.py del PIL, perché hai un nuovo _imaging.so nella tua directory di costruzione. E assicurati di modificare JPEG_ROOT in setup.py per raccogliere l'intestazione corretta e le directory .so in fase di compilazione.

2

Nota, per tutti coloro che ottengono questo errore con un virtualenv su Ubuntu, this post è utile.

Fondamentalmente, Ubuntu installa oggetti condivisi in posizioni di cui pip non sa nulla. In questo caso, pip si aspetta che le librerie di sistema siano in/usr/lib, ma Ubuntu le mette in/usr/lib/x86_64-linux-gnu, o in qualche altra posizione dipendente da architexture.

breve termine fix è semplicemente symlink le librerie in/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/ 

Questa corretto l'errore per me su Ubuntu 12.04.

Problemi correlati