2011-01-31 39 views
11

當覆蓋模型保存方法時,有沒有辦法獲取上傳文件的內容類型?我試過這個:Django - 獲取上傳的文件類型/ mimetype

def save(self): 
    print(self.file.content_type) 
    super(Media, self).save() 

但它沒有奏效。在這個例子中,self.file是model.FileField:

file = models.FileField(upload_to='uploads/%m-%Y/') 

編輯:我希望能夠在內容類型保存到數據庫中,因此我需要它之前保存實際上是完成:)

+0

我想保存文件保存()完成後。我可能是錯誤的想法。所以嘗試翻轉第二行和第三行,這樣save()然後print()。 – dotty 2011-01-31 16:50:51

+0

工作正常,但我需要事先獲取數據,因爲我想將內容類型保存到數據庫。我應該在原來的問題中提到這一點。 – Hanpan 2011-01-31 16:56:17

回答

25
class MyForm(forms.ModelForm): 

    def clean_file(self): 
     file = self.cleaned_data['file'] 
     try: 
      if file: 
       file_type = file.content_type.split('/')[0] 
       print file_type 

       if len(file.name.split('.')) == 1: 
        raise forms.ValidationError(_('File type is not supported')) 

       if file_type in settings.TASK_UPLOAD_FILE_TYPES: 
        if file._size > settings.TASK_UPLOAD_FILE_MAX_SIZE: 
         raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.TASK_UPLOAD_FILE_MAX_SIZE), filesizeformat(file._size))) 
       else: 
        raise forms.ValidationError(_('File type is not supported')) 
     except: 
      pass 

     return file 

settings.py

TASK_UPLOAD_FILE_TYPES = ['pdf', 'vnd.oasis.opendocument.text','vnd.ms-excel','msword','application',] 
TASK_UPLOAD_FILE_MAX_SIZE = "5242880" 
5

根據該文檔,處理表單上傳應該能夠在request.FILES

拼圖的最後一塊的位來獲得MIME類型(含警告)您的視圖代碼是 處理實際文件來自 request.FILES的數據。 字典中的每個條目都是一個UploadedFile對象 - 圍繞上傳文件的簡單包裝。你通常會使用這些 方法之一上傳的內容 訪問:

類UploadedFile¶除了 那些文件繼承,所有 UploadedFile的對象定義 以下方法/屬性:

UploadedFile的.content_type與 文件(例如text/plain或 application/pdf)一起上傳的 內容類型標頭。像用戶提供的任何數據 一樣,您不應該信任 上載的文件實際上是 這種類型。您仍需要 才能驗證文件是否包含內容類型標頭 聲稱的「信任但驗證」的 內容。

這一切都在這裏:http://docs.djangoproject.com/en/1.2/topics/http/file-uploads/(雖然我切n在上面的開發文檔粘貼...)

我不能看到模型content_typeFileField s的所有的文檔...