5

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

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

显然,它将上传限制为指定扩展名的图像。但我打算用它来上传这些格式(也许不止这些)

  • Microsoft Office 文件(.doc、.docx、.xls、.xlsx 等)
  • Adobe 阅读器(.pdf)
  • 可能还有档案(.rar、.zip、.7z)

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

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

任何帮助,将不胜感激。

4

2 回答 2

4

这些不是您要匹配的文件扩展名,而是MIME types

常见图像格式的 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 列表,或者如果你想真正确定并考虑变体,可以是一个字典)。

阅读MIME 类型,检查IANA MIME 媒体类型列表作为已注册 MIME 类型的权威来源,并使用 Pythonmimetypes模块按文件扩展名查找 mimetypes,反之亦然。

于 2012-09-30T17:50:19.367 回答
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
于 2016-06-24T21:31:44.690 回答