问答详情
源自:4-4 单文件、多文件上传及参数详解

文件上传使用File,UpFIle报错KeyError: <class 'pydantic.main.Body_upload_file_upload_upload_file_post'>

2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:90] - INFO - Web app server start initialize......
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:77] - INFO - Blueprint / is register
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:77] - INFO - Blueprint /ai is register
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:77] - INFO - Blueprint /upload is register
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:92] - INFO - Web app server end initialize......
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:90] - INFO - Web app server start initialize......
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:77] - INFO - Blueprint / is register
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:77] - INFO - Blueprint /ai is register
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:77] - INFO - Blueprint /upload is register
2023/11/14 22:43:33 - E:\github\sqlai-api\deploy\__init__.py[line:92] - INFO - Web app server end initialize......
INFO:     Started server process [8816]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:54321 (Press CTRL+C to quit)
INFO:     127.0.0.1:51422 - "GET /docs HTTP/1.1" 200 OK
INFO:     127.0.0.1:51422 - "GET /openapi.json HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "D:\anaconda\envs\openai\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 408, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 84, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\applications.py", line 1106, in __call__
    await super().__call__(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\applications.py", line 122, in __call__
    await self.middleware_stack(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\middleware\errors.py", line 184, in __call__
    raise exc
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\middleware\errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\middleware\cors.py", line 83, in __call__
    await self.app(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\middleware\cors.py", line 83, in __call__
    await self.app(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\middleware\exceptions.py", line 79, in __call__
    raise exc
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\middleware\exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 20, in __call__
    raise e
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 17, in __call__
    await self.app(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\routing.py", line 718, in __call__
    await route.handle(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "D:\anaconda\envs\openai\Lib\site-packages\starlette\routing.py", line 66, in app
    response = await func(request)
               ^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\applications.py", line 1061, in openapi
    return JSONResponse(self.openapi())
                        ^^^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\applications.py", line 1033, in openapi
    self.openapi_schema = get_openapi(
                          ^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\openapi\utils.py", line 475, in get_openapi
    field_mapping, definitions = get_definitions(
                                 ^^^^^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\_compat.py", line 471, in get_definitions
    return {}, get_model_definitions(
               ^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda\envs\openai\Lib\site-packages\fastapi\_compat.py", line 374, in get_model_definitions
    model_name = model_name_map[model]
                 ~~~~~~~~~~~~~~^^^^^^^
KeyError: <class 'pydantic.main.Body_upload_file_upload_upload_file_post'>





代码:

from fastapi import APIRouter, Path, Query, Request, Response, Form, Cookie, Header, status
from fastapi import File, UploadFile
from pydantic import BaseModel, Field
from typing import Optional, Union, List, Tuple, Dict


upload = APIRouter(prefix='/upload', tags=["文件上传"])


@upload.post('/file')
async def file_(file: bytes = File(..., title="file", description="小文件单文件上传")):
    return {"file": file}


@upload.post('/files')
async def files_(files: List[bytes] = File(..., title="files", description="小文件多文件上传")):
    for f in files:
        print(f, len(f))
    return {"files": len(files)}


@upload.post('/upload_files')
async def upload_files(files: List[UploadFile] = File(..., title="files", description="大文件多文件上传")):
    for f in files:
        content = await f.read()
        print(f, len(f), f.filename)
    return {"files": len(files)}

提问者:Pygo_ 2023-11-14 22:48

个回答