Téléchargement de fichiers volumineux avec le côté serveur de FastAPI
Le serveur FastAPI peut gérer les téléchargements de fichiers volumineux à l'aide de la classe UploadFile. Voici un exemple :
async def uploadfiles(upload_file: UploadFile = File(...)): ...
Problème avec les demandes côté client
Lors de l'envoi de fichiers volumineux depuis le client, des problèmes peuvent survenir pour les raisons suivantes :
Option plus rapide utilisant .stream()
En accédant à la requête body sous forme de flux, vous pouvez éviter de charger l’intégralité du fichier en mémoire, ce qui accélère les téléchargements. Ceci peut être réalisé en utilisant la méthode .stream(). Voici un exemple utilisant la bibliothèque streaming-form-data :
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)
Option alternative utilisant UploadFile et Form
Si vous préférez utiliser un point de terminaison def standard, vous peut gérer les téléchargements de fichiers comme suit :
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}"}
Augmentation du client HTTPX Délai d'expiration
Lorsque vous utilisez la bibliothèque HTTPX, vous devrez peut-être augmenter le délai d'attente pour éviter les délais de lecture lors des téléchargements de fichiers volumineux.
timeout = httpx.Timeout(None, read=180.0)
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!