怎麼判斷文件類型?通過文件名後綴?這是完全不可靠的,有絕對可靠的方式嗎?沒有
相對可靠的方式就是通過文件文件內容(二進制流)來判斷(極少數文件類型沒有特殊的文件頭或者特徵,這種方式也判斷不出來)
python 生態下,有什麼已經封裝好的,可以通過文件內容判斷文件類型的包嗎?有,經典的就是 filetype ,以及谷歌 2024年使用 AI 做的 magika
filetype 的優點就不説了,缺點就是這個包從 2022 年之後就不維護了: https://pypi.org/project/filetype/#history
至於 Magika 的情況,可以參考:Rust + AI!谷歌 Magika 1.0 把文件識別提升到新高度
然後提供一下使用案例
filetype 案例:用户傳過來的圖像需要保存在 oss 中,怎麼做圖片格式判斷?基於不要相信客户端的原則,客户傳過來的 cat.jpg 實際可能是 png 甚至 gif
下面提供了一個 filetype 的用法示例
把圖片上傳到 aliyun oss 的時候,需要設置 content_type 和 suffix
import filetype
def upload_image(self, stream: bytes, suffix: str) -> str:
"""
上傳圖片對象到 oss
"""
extension = None
mime = None
result = filetype.guess(stream)
if result:
extension = result.extension
mime = result.mime
self.upload_stream(stream, content_type=mime,
prefix='xxxxx', suffix=extension)
def upload_stream(self, stream: bytes, content_type: str | None, prefix: str, suffix: str | None) -> str:
"""
上傳二進制對象到 oss
"""
hashcode = get_stream_md5(stream)
file_like_obj = io.BytesIO(stream)
oss_file_path: str = f'{prefix}/{hashcode}' + \
(f'.{suffix}' if suffix else '')
self.bucket.put_object(
oss_file_path,
file_like_obj,
headers={'Content-Type': content_type} if content_type else None
)
return oss_file_path