使用 FastAPI 的服务器端上传大文件
FastAPI 服务器可以使用 UploadFile 类处理大文件上传。下面是一个示例:
async def uploadfiles(upload_file: UploadFile = File(...)): ...
客户端请求问题
从客户端发送大文件时,可能会因以下原因出现问题:
使用 .stream() 的更快选项
通过访问请求body 作为流,可以避免将整个文件加载到内存中,从而提高上传速度。这可以使用 .stream() 方法来实现。以下是使用streaming-form-data库的示例:
from streaming_form_data import StreamingFormDataParser from streaming_form_data.targets import FileTarget request_body = await request.stream() parser = StreamingFormDataParser(headers=request.headers) parser.register('upload_file', FileTarget(filepath)) async for chunk in request_body: parser.data_received(chunk)
使用UploadFile和Form的替代选项
如果您更喜欢使用常规的def端点,您可以可以处理文件上传如下:
from fastapi import File, UploadFile, Form, HTTPException, status import aiofiles import os CHUNK_SIZE = 1024 * 1024 @app.post("/upload") async def upload(file: UploadFile = File(...), data: str = Form(...)): try: filepath = os.path.join('./', os.path.basename(file.filename)) async with aiofiles.open(filepath, 'wb') as f: while chunk := await file.read(CHUNK_SIZE): await f.write(chunk) except Exception: raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail='There was an error uploading the file') finally: await file.close() return {"message": f"Successfuly uploaded {file.filename}"}
增加HTTPX客户端超时
使用HTTPX库时,可能需要增加超时,以防止大文件上传时读取超时。
timeout = httpx.Timeout(None, read=180.0)
以上是如何使用FastAPI高效上传大文件?的详细内容。更多信息请关注PHP中文网其他相关文章!