Django: открыть загруженный файл, находясь в памяти; В методе Form Clean?

Мне нужно проверить содержимое загруженного XML файла в моем чистом методе Form, но я не могу открыть файл для проверки. Он плавно очищается, файл еще не перемещен из памяти (или временного каталога) в целевой каталог.

Например, следующий код не работает, потому что файл еще не был перемещен в это место назначения. Он все еще находится в памяти (или временном каталоге):

xml_file = cleaned_data.get('xml_file')
xml_file_absolute = '%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': xml_file}
xml_size = str(os.path.getsize(xml_file_absolute))

Когда я смотрю на переменную "cleaned_data", она показывает это:

{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>}

cleaned_data.get('xml_file') возвращает строку "texting.nzb" как строку.

Есть ли другой способ доступа к файлу в памяти (или временном каталоге)?


Опять же, это в моем методе Form clean, который связан с представлением администрирования по умолчанию. Мне снова и снова говорили, что все проверки должны обрабатываться в форме, а не в представлении. Правильно?

Ответ 1

Я предполагаю, что вы связали свою форму с файлами, используя:

my_form = MyFormClass(request.POST, request.FILES)

Если у вас есть, после того, как форма была проверена, вы можете получить доступ к самому содержимому файла, используя словарь request.FILES:

if my_form.is_valid():
    data = request.FILES['myfile'].read()

Объект request.FILES ['myfile'] является объектом UploadedFile, поэтому он поддерживает операции чтения/записи, подобные файлу.

Если вам нужно получить доступ к содержимому файла из метода формы clean (или любого метода чистящего оборудования), вы делаете все правильно. cleaned_data.get('xml_file') возвращает объект UploadedFile. Метод __str__ этого объекта просто распечатывает строку, поэтому вы видите только имя файла. Однако вы можете получить доступ ко всему содержимому:

xml_file = myform.cleaned_data.get('xml_file')
print xml_file.read()

В этом разделе документации есть несколько отличных примеров: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/