Django: открыть загруженный файл, оставаясь в памяти; В форме Чистый метод? - PullRequest
13 голосов
/ 11 марта 2009

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

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

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" в виде строки.

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


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

1 Ответ

18 голосов
/ 11 марта 2009

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

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...