Django - 获取上传的文件类型/ mimetype

时间:2011-01-31 16:49:22

标签: django

在覆盖模型保存方法时,有没有办法获取上传文件的内容类型?我试过这个:

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

但它没有用。在此示例中,self.file是model.FileField:

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

编辑:我希望能够将内容类型保存到数据库中,所以在保存实际完成之前我需要它:)

5 个答案:

答案 0 :(得分:27)

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 :(得分:6)

根据文档,处理表单上传的视图代码应该能够以request.FILES

的位来获取mimetype(带警告)
  

最后一块拼图是   处理来自的实际文件数据   request.FILES。每个条目都在此   dictionary是一个UploadedFile对象    - 围绕上传文件的简单包装器。你通常会使用其中一种   访问上传​​的方法   含量:

     

类UploadedFile¶除了   所有继承自File的那些   UploadedFile对象定义了   以下方法/属性:

     

UploadedFile.content_type   上传的内容类型标题   文件(例如text / plain或   应用/ PDF)。像任何数据一样   由用户提供,你不应该   相信上传的文件是   实际上这种类型。你还需要   验证该文件包含   内容即内容类型标题   声称 - “信任但验证。”

这就是全部:http://docs.djangoproject.com/en/1.2/topics/http/file-uploads/(虽然我从上面的开发文档中删除了n个粘贴...)

我在文档中根本找不到模型content_type上的FileField ...

答案 2 :(得分:4)

您可以使用PIL或magic来读取前几个字节,并以此方式获取MIME类型。我不会信任content_type,因为任何人都可以伪造HTTP标头。

下面的魔术解决方案。对于PIL实施,您可以从django的get_image_dimensions中获得启发。

import magic


def get_mime_type(file):
    """
    Get MIME by reading the header of the file
    """
    initial_pos = file.tell()
    file.seek(0)
    mime_type = magic.from_buffer(file.read(1024), mime=True)
    file.seek(initial_pos)
    return mime_type

文件是视图中内存中上传的文件。

答案 3 :(得分:1)

我正在使用Django Rest Framework,这是确定内容类型/ MIME类型的最简单方法:

file = request.data.get("file")    # type(file) = 'django.core.files.uploadedfile.InMemoryUploadedFile'
print(file.content_type)

假设我上传了JPEG图像,那么我的输出将是:

image/jpeg

在评论中让我知道这是否符合您的目的。

答案 4 :(得分:0)

我正在使用Django Rest Framework,这是我最简单的方法:

file = request.data.get("file")    # type(file) = 'django.core.files.uploadedfile.InMemoryUploadedFile'
print(file.content_type)

假设我上传了JPEG图像,那么我的输出将是:

image/jpeg