Python中如何从base64字符串或bytes对象获取文件扩展名
Python 3.8 从bytes/Base64字符串获取文件扩展名实现方案
方案1:使用第三方库python-magic(推荐,准确率最高)
该方案基于文件头魔数识别格式,支持绝大多数主流文件类型,实现最简单。
前置安装
根据你的操作系统选对应安装命令:
- Windows:
pip install python-magic-bin - Linux:先执行系统命令
apt install libmagic1(Debian/Ubuntu)或yum install file-libs(CentOS),再执行pip install python-magic - MacOS:先执行
brew install libmagic,再执行pip install python-magic
完整实现代码
你可以直接用下面的逻辑替换SOMETHING_HEAR部分:
import base64 import magic import mimetypes def get_extension_from_base(base): # 兼容带data URI前缀的base64,比如data:image/png;base64,xxxx if ';base64,' in base: mime_type = base.split(';')[0].split(':')[1] # 直接从MIME类型拿扩展名 ext = mimetypes.guess_extension(mime_type) return ext.lstrip('.') if ext else None # 纯base64的情况解码后判断 decode_bytes = base64.b64decode(base) # 从bytes识别MIME类型 mime_type = magic.from_buffer(decode_bytes, mime=True) ext = mimetypes.guess_extension(mime_type) # 去掉扩展名前的点,返回纯后缀,比如png、pdf return ext.lstrip('.') if ext else None
方案2:无第三方依赖的极简实现
如果不想安装额外库,可以自己维护常见文件的魔数映射,适合只需要识别少量常用格式的场景:
import base64 # 常见文件魔数映射,可按需扩展 MAGIC_NUMBERS = { b'\xff\xd8\xff': 'jpg', b'\x89PNG\r\n\x1a\n': 'png', b'GIF87a': 'gif', b'GIF89a': 'gif', b'BM': 'bmp', b'%PDF-': 'pdf', b'PK\x03\x04': 'docx/xlsx/zip', # 注意zip系列格式魔数相同,无法区分 b'\x49\x49\x2a\x00': 'tiff', b'\x4d\x4d\x00\x2a': 'tiff', b'\x1a\x45\xdf\xa3': 'mkv', b'\x00\x00\x00\x18ftypmp42': 'mp4', } def get_extension_from_base(base): decode_bytes = base64.b64decode(base) # 遍历魔数匹配 for magic_num, ext in MAGIC_NUMBERS.items(): if decode_bytes.startswith(magic_num): return ext # 未匹配到返回None return None
注意事项
mimetypes是Python标准库,不需要额外安装- 魔数识别无法区分同一魔数的不同格式,比如zip、docx、xlsx都是用相同的PK开头魔数,这种场景优先用带MIME前缀的base64判断更准确
- 对于自定义格式的文件,两种方案都需要自己补充对应识别规则
内容的提问来源于stack exchange,提问作者pedro Henrique Assumpção
相关产品推荐
相关产品推荐

