我使用的应用程序中包含以下行:
ACCEPT_FILE_TYPES = re.compile('image/(gif|p?jpeg|(x-)?png)')
显然,它会将上传内容限制为指定扩展程序的图片。但我打算用它来上传这些格式(甚至可能更多)
我想它需要重写为以下形式:
ACCEPT_FILE_TYPES = re.compile('/(docx?|xlsx?|pdf|rar|zip|7z)')
任何帮助都将不胜感激。
答案 0 :(得分:2)
这些不是您尝试匹配的文件扩展名,而是 MIME类型。
常见图像格式的MIME类型恰好非常简单,例如:
image/png
image/jpeg
image/gif
但大多数其他类型不是,而是使用这样的MIME类型:
.pdf application/pdf
.doc application/msword
.xls application/vnd.ms-excel
.rar application/x-rar-compressed
.7z application/x-7z-compressed
.zip application/zip
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltx application/vnd.openxmlformats-officedocument.spreadsheetml.template
.potx application/vnd.openxmlformats-officedocument.presentationml.template
.ppsx application/vnd.openxmlformats-officedocument.presentationml.slideshow
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.sldx application/vnd.openxmlformats-officedocument.presentationml.slide
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template
注意:这些只是各种文件格式最常用的MIME类型。 IANA是注册MIME类型的官方权限,但在野外,您将遇到许多不同的变体,具体取决于使用它们的程序(邮件客户端,浏览器,Web服务器......)。
因此,您不应该使用正则表达式来匹配它们,而是维护一个允许的MIME类型的注册表(如果您想真正确定并考虑变体,可以是简单的Python列表或字典)。 / p>
阅读MIME types,查看IANA MIME Media Types list作为已注册MIME类型的权威来源,并使用Python mimetypes
module按文件扩展名查找mimetypes,反之亦然。
答案 1 :(得分:0)
此函数评估给定的URI是否对应于具有有效mime类型的文件。
import mimetypes
a = 'http://www.cwi.nl:80/%7Eguido/Python.html'
b = '/data/Python.txt'
c = 532
d = u'dkakasdkjdjakdjadjfalskdjfalk'
e = u'http://tobeclever.ru/download/martin_george_a_game_of_thrones.pdf'
# The optional strict argument is a flag specifying whether the list
# of known MIME types is limited to only the official types registered
# with IANA. When strict is True (the default), only the IANA types are
# supported; when strict is False, some additional non-standard but commonly
# used MIME types are also recognized.
def mimetype_validator(x):
try:
(guessed_type, encoding_guessed) = mimetypes.guess_type(x, strict=True)
return True if guessed_type in mimetypes.types_map.values() else False
except:
return False
print mimetype_validator(a)
print mimetype_validator(b)
print mimetype_validator(c)
print mimetype_validator(d)
print mimetype_validator(e)
给出:
True
True
False
False
True