有没有办法在覆盖模型保存方法时获取上传文件的内容类型?我试过这个:
def save(self):
print(self.file.content_type)
super(Media, self).save()
Run Code Online (Sandbox Code Playgroud)
但它没有用.在此示例中,self.file是model.FileField:
file = models.FileField(upload_to='uploads/%m-%Y/')
Run Code Online (Sandbox Code Playgroud)
编辑:我希望能够将内容类型保存到数据库,所以在保存实际完成之前我需要它:)
mos*_*krc 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
Run Code Online (Sandbox Code Playgroud)
settings.py
TASK_UPLOAD_FILE_TYPES = ['pdf', 'vnd.oasis.opendocument.text','vnd.ms-excel','msword','application',]
TASK_UPLOAD_FILE_MAX_SIZE = "5242880"
Run Code Online (Sandbox Code Playgroud)
Pit*_*kos 11
您可以使用 PIL 或魔法来读取前几个字节并以这种方式获取 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
Run Code Online (Sandbox Code Playgroud)
文件是视图中的内存上传文件。
根据文档,处理表单上传的视图代码应该能够获得mimetype(带有警告) request.FILES
拼图的最后一部分是处理来自request.FILES的实际文件数据.此字典中的每个条目都是一个UploadedFile对象 - 一个围绕上传文件的简单包装器.您通常会使用以下方法之一来访问上传的内容:
classUploadedFile除了从File继承的那些之外,所有UploadedFile对象都定义了以下方法/属性:
UploadedFile.content_type随文件上传的内容类型标头(例如text/plain或application/pdf).与用户提供的任何数据一样,您不应相信上传的文件实际上是此类型.您仍然需要验证该文件是否包含内容类型标头声明的内容 - "信任但验证".
这一切都在这里:http://docs.djangoproject.com/en/1.2/topics/http/file-uploads/(虽然我从上面的开发文档剪切了n个粘贴...)
在文档中我根本看不到content_type模型FileField的...
| 归档时间: |
|
| 查看次数: |
28402 次 |
| 最近记录: |