在覆盖模型保存方法时,有没有办法获取上传文件的内容类型?我试过这个:
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 :(得分: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
最后一块拼图是 处理来自的实际文件数据 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