Проверка формы Django, очистка () и загрузка файла - PullRequest
10 голосов
/ 18 февраля 2011

Может ли кто-то осветить меня относительно того, когда загруженный файл действительно записывается в местоположение, возвращаемое «upload_to» в FileField, в частности, в отношении порядка проверки, очистки и поля, модели и формы?

Прямо сейчас у меня есть «чистый» метод в моей модели, который предполагает, что загруженный файл находится на месте, поэтому он может выполнить некоторую проверку на нем. Похоже, что файл еще не сохранен, и может просто храниться во временной папке или в памяти. Если это так, как мне «открыть» его или найти путь к нему, если мне нужно выполнить какой-нибудь внешний процесс / программу для проверки файла?

Спасибо

Ian

Ответы [ 3 ]

8 голосов
/ 18 февраля 2011

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

Связанная форма будет содержать открытый объект File, поэтому вы должны иметь возможность выполнить любую проверку этого объекта напрямую.Например:

form = MyForm(request.POST, request.FILES)
if form.is_valid():
    file_object = form.cleaned_data['myFile']
    #run any validation on the file_object, or define a clean_myFile() method 
    #  that will be run automatically when you call form.is_valid()

    model_inst = MyModel('my_file' = file_object,
                     #assign other attributes here....
                     )
    model_inst.save() #file is saved to disk here
3 голосов
/ 18 февраля 2011

Что нужно для этого сделать? Если ваша проверка будет работать без временного файла, вы можете получить доступ к данным, вызвав read() того, что возвращает поле вашего файла.

def clean_field(self):
    _file = self.cleaned_data.get('filefield')
    contents = _file.read()

Если вам это нужно на диске, вы знаете, куда идти отсюда :) запишите его во временную папку и поработайте над ним!

1 голос
/ 26 апреля 2011

Или напишите это как пользовательское поле формы.Это основная идея о том, как я проверяю файл MP3 с помощью библиотеки 'mutagen'.

Примечания:

  • Сначала проверьте размер файла, затем, если правильный размер, запишите в tmplocation.
  • Запишет файл во временную папку, указанную в SETTINGS, проверит его MP3, а затем удалит.

Код:

from django import forms

import os
from mutagen.mp3 import MP3, HeaderNotFoundError, InvalidMPEGHeader

from django.conf import settings

class MP3FileField(forms.FileField):

    def clean(self, *args, **kwargs):
        super(MP3FileField, self).clean(*args, **kwargs)
        tmp_file = args[0]

        if tmp_file.size > 6600000:
            raise forms.ValidationError("File is too large.")

        file_path = getattr(settings,'FILE_UPLOAD_TEMP_DIR')+'/'+tmp_file.name

        destination = open(file_path, 'wb+')
        for chunk in tmp_file.chunks():
            destination.write(chunk)
        destination.close()

        try:
            audio = MP3(file_path)
            if audio.info.length > 300:
                os.remove(file_path)
                raise forms.ValidationError("MP3 is too long.")

        except (HeaderNotFoundError, InvalidMPEGHeader):
            os.remove(file_path)
            raise forms.ValidationError("File is not valid MP3 CBR/VBR format.")
        os.remove(file_path)
        return args
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...