2011-01-31 29 views
11

Có cách nào để lấy loại nội dung của tệp tải lên khi ghi đè phương pháp lưu mô hình không? Tôi đã thử điều này:Django - Tải loại tệp được tải lên/mimetype

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

Nhưng nó không hoạt động. Trong ví dụ này, self.file là một model.FileField:

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

Chỉnh sửa: Tôi muốn để có thể lưu các kiểu nội dung cơ sở dữ liệu, vì vậy tôi sẽ cần nó trước khi tiết kiệm thực sự hoàn tất :)

+0

tôi nghĩ rằng các tập tin được lưu SAU save() được thực hiện. Tôi có thể nghĩ sai. Vì vậy, hãy thử lật dòng thứ 2 và thứ 3 xung quanh, vì vậy hãy lưu() rồi in(). – dotty

+0

Điều đó có hiệu quả, nhưng tôi sẽ cần lấy dữ liệu trước khi tôi muốn lưu loại nội dung vào cơ sở dữ liệu. Tôi nên đã đề cập rằng trong câu hỏi ban đầu. – Hanpan

+0

Vì vậy, lưu nó, lấy loại mime, điền vào trường loại nội dung của bạn, sau đó siêu (...) .lưu lại. Nên hoạt động giống như cập nhật. – Spacedman

Trả lời

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" 
+1

Làm thế nào để bạn gọi clean_file? –

+0

clean_file thường được gọi khi bạn cần xác nhận biểu mẫu với is_valid() –

+4

Tôi nghĩ rằng ngoại trừ phải bắt AttributeError. Nếu không, các hình thức.ValidationError có bị nuốt chửng không? –

5

Theo các tài liệu, mã tầm nhìn của bạn để xử lý việc tải lên hình thức sẽ có thể để có được những mimetype (với hãy cẩn thận) theo bit của request.FILES

Giai đoạn cuối cùng của câu đố là xử lý các tập tin thực tế dữ liệu từ request.FILES. Mỗi mục nhập trong từ điển này là một đối tượng UploadedFile - một trình bao bọc đơn giản xung quanh tệp được tải lên. Bạn thường sẽ sử dụng một trong những phương pháp để truy cập tải lên nội dung:

lớp UploadedFile¶ Ngoài những thừa hưởng từ File, tất cả các đối tượng uploadedfile xác định phương pháp sau đây/thuộc tính:

uploadedfile .content_type tiêu đề loại nội dung được tải lên với tệp (ví dụ: văn bản/đồng bằng hoặc ứng dụng/pdf). Giống như bất kỳ dữ liệu nào do người dùng cung cấp, bạn không nên tin tưởng rằng tệp được tải lên là thực sự là loại này. Bạn vẫn sẽ cần để xác thực rằng tệp có chứa nội dung rằng tiêu đề loại nội dung có tiêu đề là - "tin cậy nhưng xác minh".

Đây là tất cả ở đây: http://docs.djangoproject.com/en/1.2/topics/http/file-uploads/ (mặc dù tôi cắt n dán từ các tài liệu dev trên ...)

Tôi không thể nhìn thấy một content_type trên mô hình FileField s ở tất cả các tài liệu trong ...

Các vấn đề liên quan