有人可以告訴我,上傳文件實際上是否寫入FileField中「upload_to」返回的位置,特別是關於字段順序,模型和表單驗證和清理?Django表單驗證,清理()和文件上傳
現在我在我的模型上有一個「乾淨」的方法,假設上傳的文件就位,所以它可以做一些驗證。它看起來像文件尚未保存,並可能只是在一個臨時的位置或內存中。如果是這種情況,如果我需要執行一些外部過程/程序來驗證文件,我該如何「打開」它或找到它的路徑?
感謝,
伊恩
有人可以告訴我,上傳文件實際上是否寫入FileField中「upload_to」返回的位置,特別是關於字段順序,模型和表單驗證和清理?Django表單驗證,清理()和文件上傳
現在我在我的模型上有一個「乾淨」的方法,假設上傳的文件就位,所以它可以做一些驗證。它看起來像文件尚未保存,並可能只是在一個臨時的位置或內存中。如果是這種情況,如果我需要執行一些外部過程/程序來驗證文件,我該如何「打開」它或找到它的路徑?
感謝,
伊恩
形式的清潔無關與實際保存文件,或與保存任何其他數據對這一問題。直到運行模型實例的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
你需要做什麼?如果您的驗證在沒有臨時文件的情況下運行,您可以通過調用read()
來獲取您的文件字段返回的數據。
def clean_field(self):
_file = self.cleaned_data.get('filefield')
contents = _file.read()
如果您確實需要它在磁盤上,你知道在哪裏何去何從:)寫入到一個臨時位置,做一些關於它的神奇!
或將其寫入爲自定義表單字段。這是我如何使用'誘變'庫驗證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
任何方式在模型驗證,而不是在表單驗證做到這一點? – IanSR 2011-02-18 13:48:01
這個代碼應該放在哪裏? – andi 2014-03-27 17:22:53