Heim > Backend-Entwicklung > Python-Tutorial > Wie lade ich große Dateien (≥3 GB) effizient auf ein FastAPI-Backend hoch?

Wie lade ich große Dateien (≥3 GB) effizient auf ein FastAPI-Backend hoch?

Mary-Kate Olsen
Freigeben: 2024-11-28 09:46:12
Original
119 Leute haben es durchsucht

How to Efficiently Upload Large Files (≥3GB) to a FastAPI Backend?

Wie lade ich eine große Datei (≥3 GB) in das FastAPI-Backend hoch?

Verwenden des Requests-Toolbelt

Bei Verwendung der Requests-Toolbelt-Bibliothek Achten Sie darauf, sowohl den Dateinamen als auch den Content-Type-Header anzugeben, wenn Sie das Feld für upload_file deklarieren. Hier ist ein Beispiel:

filename = 'my_file.txt'
m = MultipartEncoder(fields={'upload_file': (filename, open(filename, 'rb'))})
r = requests.post(
    url,
    data=m,
    headers={'Content-Type': m.content_type},
    verify=False,
)
print(r.request.headers)  # confirm that the 'Content-Type' header has been set.
Nach dem Login kopieren

Verwendung von Python-Anfragen/HTTPX

Eine weitere Option ist die Verwendung von Python-Anfragen oder HTTPX-Bibliotheken, die beide Streaming-Datei-Uploads effizient verarbeiten können. Hier sind jeweils Beispiele:

Anfragen verwenden:

import requests

url = '...'
filename = '...'

with open(filename, 'rb') as file:
    r = requests.post(
        url,
        files={'upload_file': file},
        headers={'Content-Type': 'multipart/form-data'},
    )
Nach dem Login kopieren

HTTPX verwenden:

import httpx

url = '...'
filename = '...'

with open(filename, 'rb') as file:
    r = httpx.post(
        url,
        files={'upload_file': file},
    )
Nach dem Login kopieren

HTTPX automatisch unterstützt Streaming-Datei-Uploads, während Anfragen erfordern, dass Sie den Content-Type-Header auf setzen 'multipart/form-data'.

Verwendung der FastAPI Stream()-Methode

Mit der .stream()-Methode von FastAPI können Sie das Laden einer großen Datei in den Speicher vermeiden, indem Sie als Stream auf den Anforderungstext zugreifen . Um diesen Ansatz zu verwenden, befolgen Sie diese Schritte:

  1. Installieren Sie die Streaming-Formulardatenbibliothek:Diese Bibliothek stellt einen Streaming-Parser für Multipart-/Formulardatendaten bereit.
  2. Erstellen Sie einen FastAPI-Endpunkt: Verwenden Sie die Methode .stream(), um den Anforderungstext als Stream zu analysieren und den Stream zu nutzen ing_form_data-Bibliothek zum Parsen von Multipart-/Formulardaten.
  3. Ziele registrieren: Definieren Sie FileTarget- und ValueTarget-Objekte zum Parsen von Datei- bzw. Formulardaten.

Validierung der hochgeladenen Dateigröße

Um sicherzustellen, dass die hochgeladene Dateigröße einen angegebenen Wert nicht überschreitet Wenn Sie die Grenze überschreiten, können Sie einen MaxSizeValidator verwenden. Hier ist ein Beispiel:

from streaming_form_data import streaming_form_data
from streaming_form_data import MaxSizeValidator

FILE_SIZE_LIMIT = 1024 * 1024 * 1024  # 1 GB

def validate_file_size(chunk: bytes):
    if FILE_SIZE_LIMIT > 0:
        streaming_form_data.validators.MaxSizeValidator( FILE_SIZE_LIMIT). __call__(chunk)
Nach dem Login kopieren

Implementierung des Endpunkts

Hier ist ein Beispielendpunkt, der diese Techniken beinhaltet:

from fastapi import FastAPI, File, Request
from fastapi.responses import HTMLResponse
from streaming_form_data.targets import FileTarget, ValueTarget
from streaming_form_data import StreamingFormDataParser

app = FastAPI()

@app.post('/upload')
async def upload(request: Request):
    # Parse the HTTP headers to retrieve the boundary string.
    parser = StreamingFormDataParser(headers=request.headers)

    # Register FileTarget and ValueTarget objects.
    file_ = FileTarget()
    data = ValueTarget()
    parser.register('upload_file', file_)
    parser.register('data', data)

    async for chunk in request.stream():
        parser.data_received(chunk)

    # Validate file size (if necessary)
    validate_file_size(file_.content)

    # Process the uploaded file and data.
    return {'message': 'File uploaded successfully!'}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie lade ich große Dateien (≥3 GB) effizient auf ein FastAPI-Backend hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage