У меня была такая же проблема, и я смог решить ее для моего случая. Это код, который django использует для определения размера файла:
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
Следовательно, django вызовет AttributeError
, если файл не существует на диске (или уже определен атрибут размера). Так как класс TemporaryFile
пытается создать файл в памяти, а не фактически на диске, этот метод _get_size
не работает. Чтобы заставить его работать, мне нужно было сделать что-то вроде этого:
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)
В качестве альтернативы (и предпочтительно), если вы можете рассчитать размер создаваемого временного файла, вы можете установить атрибут размера непосредственно для объекта TemporaryFile
. Из-за библиотек, которые я использовал, это было невозможно для меня.