.gz归档的内容类型识别错误?
我正在开发一个处理上传图片的接口。上传的图片可以是 .jpg 格式的文件,也可以是 .gz 格式的压缩文件。
url = 'http://example.com/upload'
file_path = 'path/to/my/file.gz'
files = {'file': open(file_path, 'rb')}
response = requests.post(url, files=files)
我该如何正确判断这个文件是 jpg 格式还是 gz 格式的压缩文件呢?
def post(self, request):
for _, file_data in request.FILES.items():
print(file_data.content_type)
if file_data.content_type == 'application/gzip':
# do something
elif file_data.content_type.startswith('image/'):
# do something
这个代码的问题在于,打印出来后显示的是 'application/octet-stream',我不太明白这是为什么。
1 个回答
1
.content_type
[Django-doc] 是一个由浏览器提供的信息,而不是 Django 或 Python 检查的 MIME 类型。如果浏览器不知道、在乎或者故意伪造了这个信息,那么它可能会和实际情况不符,文档中对此有说明:
内容类型头是随文件上传的(例如 text/plain 或 application/pdf)。就像任何用户提供的数据一样,你不能完全相信上传的文件确实是这个类型。你仍然需要验证文件的内容是否与内容类型头所声明的一致——“信任但要验证”。
我们可以尝试根据文件的内容来猜测 MIME 类型,使用 python-magic
[pypi.org]:
import magic
mime = magic.Magic(mime=True)
result = mime.from_descriptor(file_data.open())
需要注意的是,这个方法会读取上传的文件,因此如果是流式上传,可能会“吃掉”流的一部分,这样在确定文件类型后就可能无法再使用这个文件了。