Maison >développement back-end >Tutoriel Python >Comment télécharger efficacement des fichiers volumineux (≥3 Go) vers un backend FastAPI ?

Comment télécharger efficacement des fichiers volumineux (≥3 Go) vers un backend FastAPI ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-28 09:46:12129parcourir

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

Comment télécharger un fichier volumineux (≥3 Go) vers le backend FastAPI ?

Utilisation de Requests-Toolbelt

Lors de l'utilisation de la bibliothèque request-toolbelt, assurez-vous de spécifier à la fois le nom de fichier et l'en-tête Content-Type lors de la déclaration du champ pour upload_file. Voici un exemple :

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.

Utilisation de requêtes Python/HTTPX

Une autre option consiste à utiliser les requêtes Python ou les bibliothèques HTTPX, qui peuvent toutes deux gérer efficacement les téléchargements de fichiers en streaming. Voici des exemples pour chacun :

Utilisation des requêtes :

import requests

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

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

Utilisation de HTTPX :

import httpx

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

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

HTTPX automatiquement prend en charge les téléchargements de fichiers en streaming, tandis que les requêtes nécessitent que vous définissiez l'en-tête Content-Type sur 'multipart/form-data'.

Utilisation de la méthode FastAPI Stream()

La méthode .stream() de FastAPI vous permet d'éviter de charger un fichier volumineux en mémoire en accédant au corps de la requête sous forme de flux . Pour utiliser cette approche, suivez ces étapes :

  1. Installez la bibliothèque streaming-form-data : Cette bibliothèque fournit un analyseur de streaming pour les données multipart/form-data.
  2. Créez un point de terminaison FastAPI : Utilisez la méthode .stream() pour analyser le corps de la requête en tant que flux et utilisez le flux Bibliothèque ing_form_data pour gérer l'analyse multipart/form-data.
  3. Enregistrer les cibles : Définissez les objets FileTarget et ValueTarget pour gérer respectivement l'analyse des données de fichier et de formulaire.

Validation de la taille du fichier téléchargé

Pour garantir que la taille du fichier téléchargé ne dépasse pas une valeur spécifiée limite, vous pouvez utiliser un MaxSizeValidator. Voici un exemple :

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)

Implémentation du point de terminaison

Voici un exemple de point de terminaison qui intègre ces techniques :

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!'}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn