在没有 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
我有一个用于处理文件上传的 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