2014-07-09 15 views
7

Potrzebuję zaimportować garść zdjęć do aplikacji Django. Ja badania w powłoce, ale nie można ominąć ten błąd przy próbie zapisania obrazu: Prześlij obraz z powłoki Django

File "/lib/python3.3/codecs.py", line 301, in decode 
(result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: 
invalid start byte 

modelu:

import uuid 
from django.db import models 
from taggit.managers import TaggableManager 
import os 

def generate_filename(instance, filename): 
    f, ext = os.path.splitext(filename) 
    name = uuid.uuid4().hex 
    return 'images/%s%s' % (name, ext) 

class StudyImage(models.Model): 

    pic = models.ImageField(upload_to=generate_filename) 
    upload_date = models.DateTimeField(auto_now_add=True) 
    tags = TaggableManager() 

Kroki, aby dostać się do błędu:

Otwórz powłoka django.

import uuid 
import os 
from app import models 

p = File(open('/home/image001.png', 'r')) 
a = models.StudyImage(pic=p) 
a.pic.save('test.jpg',p) 

Co daje powyższy błąd. Nie mogę zrozumieć, dlaczego obraz jest dając unicodecodeerror ... mam tak daleko odnosząc się do "Upload" a file from django shell

Więcej szczegółów:

Django 1.7, Python 3.3

Pełna traceback:

Traceback (most recent call last):<br> 
File "<input>", line 1, in <module><br> 
File "/home/s/Pycharm/flf/venv/lib/python3.3/site- 
    packages/django/db/models/fields/files.py", line 89, in save 
self.name = self.storage.save(name, content) 
File "/home/s/Pycharm/flf/venv/lib/python3.3/site- 
    packages/django/core/files/storage.py", line 51, in save 
    name = self._save(name, content) 
File "/home/s/Pycharm/flf/venv/lib/python3.3/site- 
    packages/django/core/files/storage.py", line 224, in _save 
    for chunk in content.chunks(): 
File "/home/s/Pycharm/flf/venv/lib/python3.3/site-packages/django/core/files/base.py", 
    line 77, in chunks 
    data = self.read(chunk_size) 
File "/home/s/Pycharm/flf/venv/lib/python3.3/codecs.py", line 301, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte 
+2

Czy próbowałeś zmienić linię 'p = plik (otwórz ('/ home/image001.png', 'r'))' na 'p = plik (otwórz ('/ home/image001.png', 'rb "))'? – MBrizzle

+0

Nie, niestety, nie! To był problem. Wygląda na to, że ustawienia "r" i "rb" działają inaczej w Pythonie 3 niż w 2 - http://stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and -rb-mode. @MBrizzle - jeśli dodasz to jako odpowiedź, zaakceptuję. Dziękuję Ci. – Steve

+0

Tak, flaga 'rb' informuje uchwyt pliku, aby odczytał plik jako dane binarne, czyli to, co zrobiłbyś podczas otwierania obrazu, plików wykonywalnych itp. – Crispy

Odpowiedz

16

Byłem już przez to wcześniej, więc czuję cię - ale według mojego komentarza: zastąp 'r' z 'rb' w wywołaniu File(), i powinno działać dobrze.

Powinienem również dodać, że dla tych, którzy przyszli do tej odpowiedzi później, jest to kwestia specyficzna dla Pythona3. Spójrz na link SO w komentarzu Steve'a, aby uzyskać pełniejsze wyjaśnienie różnicy między File() między p2 i p3.

+0

Działa jak urok. Dziękuję, miły panie lub pani! – wastetime909

Powiązane problemy