.gz归档的内容类型识别错误?

1 投票
1 回答
20 浏览
提问于 2025-04-14 16:18

我正在开发一个处理上传图片的接口。上传的图片可以是 .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())

需要注意的是,这个方法会读取上传的文件,因此如果是流式上传,可能会“吃掉”流的一部分,这样在确定文件类型后就可能无法再使用这个文件了。

撰写回答