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.
Jaki jest typ błędu? –
@john Jest to AttributeError. – Conan