FastAPI文件上传

问题描述

我正在尝试使用请求将 JSON 数据 + 文件(二进制)上传到 FastAPI 'POST' 端点。

这是服务器代码

@app.post("/files/")
async def create_file(
    file: bytes = File(...),fileb: UploadFile = File(...),timestamp: str = Form(...)
):
    return {
        "file_size": len(file),"timestamp": timestamp,"fileb_content_type": fileb.content_type,}

这是客户端代码

session = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries=0)
session.mount('http://',adapter)

jpg_image = open(IMG_PATH,'rb').read()

timestamp_str = datetime.datetime.Now().isoformat()
files = {
    'timestamp': (None,timestamp_str),'file': ('image.jpg',jpg_image),}
request = requests.Request('POST',FILE_UPLOAD_ENDPOINT,files=files)
prepared_request = request.prepare()
response = session.send(prepared_request)

服务器失败

"POST /files/ HTTP/1.1" 422 不可处理实体

解决方法

当请求正文缺少必填字段或存在非预期字段等时,FastAPI 端点通常会响应 422。

您的请求正文中似乎缺少 fileb

  • 如果该字段是可选的,则必须在端点定义中如下声明:

    fileb: Optional[UploadFile] = File(None)
    

    您还需要在端点代码中进行一些检查...

  • 如果是必填字段,则需要将其添加到请求正文中。