2011-07-22 13 views
9

Mam problemy ze standardowymi plikami Django FileField i tempfile.TemporaryFile. Zawsze, gdy próbuję zapisać plik FileField za pomocą pliku tymczasowego, pojawia się błąd "Nie można określić rozmiaru pliku".Django "Nie można określić rozmiaru pliku" z plikiem tempfile.TemporaryFile

Na przykład, biorąc pod uwagę model o nazwie modelu, FileField nazwie FileField i temporaryfile nazwie tempfile:

Model.FileField.save('foobar', django.core.files.File(TempFile), save=True) 

To da mi wspomniany błąd. jakieś pomysły?

+0

Jaki jest typ błędu? –

+0

@john Jest to AttributeError. – Conan

Odpowiedz

2

Miałem ten sam problem i udało mi się go rozwiązać w moim przypadku. Jest to kod, który Django używa do określenia rozmiaru pliku:

 

def _get_size(self): 
    if not hasattr(self, '_size'): 
    if hasattr(self.file, 'size'): 
     self._size = self.file.size 
    elif os.path.exists(self.file.name): 
     self._size = os.path.getsize(self.file.name) 
    else: 
     raise AttributeError("Unable to determine the file's size.") 
    return self._size 
 

Dlatego Django zgłosi AttributeError jeśli plik nie istnieje na dysku (lub mają atrybut rozmiaru już zdefiniowany). Ponieważ klasa TemporaryFile próbuje utworzyć plik w pamięci zamiast w rzeczywistości na dysku, ta metoda _get_size nie działa. W celu uzyskania go do pracy, musiałem zrobić coś takiego:

 

import tempfile, os 
# Use tempfile.mkstemp, since it will actually create the file on disk. 
(temp_filedescriptor, temp_filepath) = tempfile.mkstemp() 
# Close the open file using the file descriptor, since file objects 
# returned by os.fdopen don't work, either 
os.close(temp_filedescriptor) 

# Open the file on disk 
temp_file = open(temp_filepath, "w+b") 

# Do operations on your file here . . . 

modelObj.fileField.save("filename.txt", File(temp_file)) 

temp_file.close() 
# Remove the created file from disk. 
os.remove(temp_filepath) 
 

Alternatywnie (i najlepiej), jeśli można obliczyć wielkość pliku tymczasowego jesteś tworzenia, można ustawić atrybut rozmiar bezpośrednio na obiekcie TemporaryFile. Ze względu na biblioteki, z których korzystałem, nie było to dla mnie możliwe.

11

Miałem ten problem z tempfile.TemporaryFile. Kiedy przełączyłem się na tempfile.NamedTemporaryFile, odszedł. Wierzę, że TemporaryFile po prostu symuluje bycie plikiem (przynajmniej w niektórych systemach operacyjnych), podczas gdy NamedTemporaryFile naprawdę jest plikiem.

2

miałem ten problem na Heroku nawet z tempfile.NamedTemporaryFile i był bardzo rozczarowany ...

I rozwiązać go za pomocą wskazówek Steven poprzez ustawienie dowolnego rozmiaru ręcznie (tak, brudny, ale praca dla mnie):

from django.core.files import File 
from django.core.files.temp import NamedTemporaryFile 

img_temp = NamedTemporaryFile() 
# Do your stuffs ... 
img_temp.flush() 
img_temp.size = 1024 

media.thumbnail.save('dummy', File(img_temp)) 

Dzięki!

Powiązane problemy