在没有 multipart/form-data 请求的情况下使用 UploadFile 直接上传文件

Using UploadFile for direct file upload without a multipart/form-data request

我有一个用于处理文件上传的 FastAPI 端点,如下所示:

@app.post('/upload')
async def accept_some_file(f: UploadFile):
    content = await f.read()
    # ... do stuff with content and generate a response

但这似乎只适用于 multipart/form-data 编码的有效负载。

我希望能够通过如下所示的请求直接发送文件字节:

POST /upload HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.79.1
Accept: */*
Content-Type: image/jpeg
Content-Length: 11044

... image bytes

是否有我可以使用的 FastAPI 设置来允许此操作?或者是否有另一种请求类型对这个用例更有意义?

您可以使用 await request.body():

获取请求正文 bytes
from fastapi import Request

@app.post('/upload')
async def accept_some_file(request: Request):
    body = await request.body()

或者,您也可以将请求主体作为流访问(通过这种方式提供字节块,而不会将整个主体存储到内存中)- 请参阅 Starlette documentation。示例:

@app.post('/upload')
async def accept_some_file(request: Request):
    body = b''
    async for chunk in request.stream():
        body += chunk