我有一个允许媒体文件上传的Django(1.11)网站。我对mime类型进行了一些基本检查(例如,仅接受“ video / m4v”文件)。
当我在浏览器中(通过Web UI)使用网站-通过python manage.py runserver
运行时,此检查工作正常。
我现在正在编写一些单元测试,但是发现无论我发布什么文件类型,它总是被当作应用程序/八位字节流的哑剧类型。
我的单元测试代码如下:
media_file = open('sample_video.m4v','rb')
self.client.login(username='admin', password='password')
response = self.client.post(reverse('oppia_av_upload'), {'media_file': media_file })
self.assertEqual(response.status_code, 200)
在self.client.post命令中,有没有一种方法可以指定mime类型,以便正确选择它?
有关信息,我知道mime类型可以“摆弄”,因此不能保证文件是它所声称的类型。
非常感谢任何帮助。
编辑: 只是为了在表单验证中包括文件上传检查代码,以防万一我在这里做错了事情:
def clean(self):
cleaned_data = super(UploadMediaForm, self).clean()
media_file = cleaned_data.get("media_file")
print(media_file.content_type)
if media_file is not None and media_file.content_type not in settings.OPPIA_MEDIA_FILE_TYPES:
raise forms.ValidationError(_(u"You may only upload a media file which is one of the following types: %s" % ', '.join(settings.OPPIA_MEDIA_FILE_TYPES)))
答案 0 :(得分:1)
您也许可以使用Django的SimpleUploadedFile
。这使您可以将内容类型附加到文件。例如:
from django.core.files.uploadedfile import SimpleUploadedFile
filename = 'sample_video.m4v'
with open(filename,'rb') as f:
media_file = SimpleUploadedFile(filename, f, content_type="video/m4v")
self.client.login(username='admin', password='password')
response = self.client.post(reverse('oppia_av_upload'), {'media_file': media_file })
self.assertEqual(response.status_code, 200)