You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FastAPI的UploadFile验证上传的jar文件类型及扩展名

FastAPI本身未内置针对jar文件的专属校验能力,你可以通过以下两种成熟方案实现真实文件类型校验:

方案1:使用python-magic第三方库校验

该方案通过读取文件二进制特征判断真实格式,不受用户篡改后缀名的影响,是通用的文件校验首选方案。

  • 安装依赖:
    Windows环境执行pip install python-magic-bin,Linux/macOS环境执行pip install python-magic(需提前在系统中安装libmagic依赖库)。
  • 代码示例:
import magic
from fastapi import FastAPI, File, UploadFile, HTTPException

app = FastAPI()
# jar文件本质是zip格式,会识别为这两类MIME类型
ALLOWED_MIME_TYPES = {"application/java-archive", "application/zip"}

@app.post("/upload")
async def upload(jar_file: UploadFile = File(...)):
    # 仅读取前1024字节用于校验,避免大文件占用过多资源
    file_header = await jar_file.read(1024)
    # 文件指针复位,后续存储/处理文件时不会丢失内容
    await jar_file.seek(0)
    
    mime_type = magic.from_buffer(file_header, mime=True)
    if mime_type not in ALLOWED_MIME_TYPES:
        raise HTTPException(status_code=400, detail="上传文件不是合法的jar文件")
    
    # 后续业务逻辑
    return {"filename": jar_file.filename, "status": "校验通过"}

方案2:无额外依赖的魔数校验

如果不想引入第三方依赖,可以直接校验jar文件的魔数(zip格式固定文件头)+后缀名,满足常规场景的校验需求。
jar文件属于zip格式变种,文件前4个字节固定为0x504B0304,对应二进制值为b'PK\x03\x04'。

  • 代码示例:
from fastapi import FastAPI, File, UploadFile, HTTPException

app = FastAPI()
JAR_MAGIC_HEADER = b'PK\x03\x04'

@app.post("/upload")
async def upload(jar_file: UploadFile = File(...)):
    # 先校验后缀名
    if not jar_file.filename.lower().endswith('.jar'):
        raise HTTPException(status_code=400, detail="仅支持上传.jar后缀的文件")
    
    # 校验文件头魔数
    file_header = await jar_file.read(4)
    await jar_file.seek(0)
    
    if file_header != JAR_MAGIC_HEADER:
        raise HTTPException(status_code=400, detail="上传文件不是合法的jar文件")
    
    # 后续业务逻辑
    return {"filename": jar_file.filename, "status": "校验通过"}

如果对安全性要求较高,可以将两种方案结合使用,进一步降低被伪造文件绕过校验的概率。

内容的提问来源于stack exchange,提问作者Reznik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:27:00