Heim >Backend-Entwicklung >Python-Tutorial >Wie lade ich große Dateien effizient mit FastAPI hoch?

Wie lade ich große Dateien effizient mit FastAPI hoch?

Linda Hamilton
Linda HamiltonOriginal
2024-12-02 01:13:11848Durchsuche

How to Efficiently Upload Large Files with FastAPI?

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:

  1. multipart/form-data Header: Die Anfrage des Clients sollte den Content-Type-Header als angeben multipart/form-data, gefolgt von der erforderlichen Grenzzeichenfolge. Wenn Sie jedoch keine Bibliothek zum Verarbeiten von Datei-Uploads verwenden, müssen Sie diesen Header manuell festlegen.
  2. MultipartEncoder-Verwendung: Stellen Sie sicher, dass der MultipartEncoder den Dateinamen einschließt, wenn er das Feld für upload_file deklariert.
  3. Bibliotheksempfehlungen: Verwendung veralteter Bibliotheken (z. B. request-toolbelt) für Datei-Uploads wird nicht empfohlen. Erwägen Sie stattdessen die Verwendung von Python-Anfragen oder HTTPX, da diese eine bessere Unterstützung für das Hochladen großer Dateien bieten.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn