如何在Python中查找mime类型
我正在尝试用Python做一些CGI脚本。如果有请求发送到我的Python脚本,我该如何找到文件类型的mime类型呢?
更新:添加更多信息 现在有一些图片,比如地址是/adress/image.jpg。但是如果我没理解错的话,mime类型是网页浏览器发送的头信息的一部分,对吧?那我该如何读取这些头信息呢?
3 个回答
你可以通过运行 pip install filemime
来安装这个软件包,然后可以这样使用它。它可以帮助你找到各种文件的类型和 MIME 类型,详细信息可以查看 filemime。
from filemime import filemime
fileObj = filemime()
mime = fileObj.load_file("Kodi_Kodi.mp3",mimeType=True)
print(f"mime-type: {mime}")
输出结果:
mime-type: 'audio/mpeg'
假设你正在用一个HTML表单提交文件,像这样:
<form enctype="multipart/form-data" method="post">
<input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
在Python的CGI脚本中,你可以用下面的方式来获取文件类型:
form = cgi.FieldStorage()
filetype = form['userfile'].type
需要注意的是,提交的文件类型是由客户端的网页浏览器决定的,并不是由Python的CGI库或HTTP服务器来检测的。你可以使用Python的 mimetypes 模块,根据文件扩展名来猜测MIME类型(比如:mimetypes.guess_type(form['userfile'].name)
)。另外,你也可以使用UNIX的 file
命令来获得更高的准确性,不过这通常会消耗更多的资源。
你有两个选择。如果运气好的话,客户端可以确定文件的类型(mimetype),并把它包含在表单提交中。通常这个信息会放在一个名为“filetype”或者类似名字的输入框里。
如果不能的话,你可以根据文件的扩展名在服务器上猜测文件类型。这有点依赖于你使用的mimetypes模块是否更新。需要注意的是,你可以在这个模块里添加新的类型或者覆盖已有的类型。然后你可以使用“guess_type”这个函数,它会根据文件名的扩展名来判断文件类型。
import mimetypes
mimetypes.add_type('video/webm','.webm')
...
mimetypes.guess_type(filename)
更新:如果我没记错的话,你可以从“Content-Type”这个头信息中获取客户端对文件类型的判断。很多时候,这个值会是'application/octet-stream',这几乎没什么用。
所以假设你在使用cgi模块,并且通过常规的multipart表单上传文件,浏览器会帮你猜测文件类型。它的猜测效果还不错,这个信息会传递到form.type参数中。你可以这样做:
import cgi
form = cgi.FieldStorage()
files_types = {};
if form.type == 'multipart/form-data':
for part in form.keys():
files_types[form[part].filename] = form[part].type
else:
files_types[form.filename] = form.type