Maison >développement back-end >Tutoriel Python >Comment télécharger efficacement des fichiers volumineux (≥3 Go) vers un backend FastAPI ?
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.
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'.
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 :
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)
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!