Heim >Backend-Entwicklung >Python-Tutorial >Wie lade ich große Dateien effizient mit FastAPI hoch?
Hochladen großer Dateien mit der Serverseite von FastAPI
Der FastAPI-Server kann das Hochladen großer Dateien mithilfe der UploadFile-Klasse verarbeiten. Hier ist ein Beispiel:
async def uploadfiles(upload_file: UploadFile = File(...)): ...
Problem mit clientseitigen Anfragen
Beim Senden großer Dateien vom Client können aus folgenden Gründen Probleme auftreten:
Schnellere Option mit .stream()
Durch Zugriff auf die Anfrage body als Stream speichern, können Sie vermeiden, die gesamte Datei in den Speicher zu laden, was zu schnelleren Uploads führt. Dies kann mit der Methode .stream() erreicht werden. Hier ist ein Beispiel für die Verwendung der Streaming-Form-Data-Bibliothek:
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)
Alternative Option mit UploadFile und Form
Wenn Sie lieber einen regulären Verteidigungsendpunkt verwenden möchten, sind Sie hier richtig kann Datei-Uploads wie folgt verarbeiten:
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-Client erhöhen Timeout
Bei Verwendung der HTTPX-Bibliothek müssen Sie möglicherweise das Timeout erhöhen, um Lese-Timeouts beim Hochladen großer Dateien zu verhindern.
timeout = httpx.Timeout(None, read=180.0)
Das obige ist der detaillierte Inhalt vonWie lade ich große Dateien effizient mit FastAPI hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!