FileTypes的正则表达式

时间:2012-09-30 17:26:16

标签: python regex

我使用的应用程序中包含以下行:

ACCEPT_FILE_TYPES = re.compile('image/(gif|p?jpeg|(x-)?png)')

显然,它会将上传内容限制为指定扩展程序的图片。但我打算用它来上传这些格式(甚至可能更多)

  • Microsoft Office文件(。doc,.docx,.xls,.xlsx等)
  • Adob​​e Reader (。pdf)
  • 可能是档案(.rar,.zip,.7z)

我想它需要重写为以下形式:

ACCEPT_FILE_TYPES = re.compile('/(docx?|xlsx?|pdf|rar|zip|7z)')

任何帮助都将不胜感激。

2 个答案:

答案 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