動態

詳情 返回 返回

python 通過文件內容判斷文件類型的方案: filetype 和 Magika

怎麼判斷文件類型?通過文件名後綴?這是完全不可靠的,有絕對可靠的方式嗎?沒有

相對可靠的方式就是通過文件文件內容(二進制流)來判斷(極少數文件類型沒有特殊的文件頭或者特徵,這種方式也判斷不出來)

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
user avatar
0 用戶, 點贊了這篇動態!

發表 評論

Some HTML is okay.