繁体   English   中英

使用 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获取。 如果您想以同步方式执行此操作(即,改用def端点,请参阅此处了解defasync def ),请查看此答案

from fastapi import Request

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

或者,您也可以按照本答案中的描述(在“更新”部分下)以 stream 的形式访问请求正文。 通过这种方式,无需将整个主体存储到内存即可提供字节块——请参阅Starlette 文档 例子:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM