Maison > développement back-end > Tutoriel Python > Comment télécharger efficacement des fichiers sur un serveur FastAPI à l'aide de « form-data » ?

Comment télécharger efficacement des fichiers sur un serveur FastAPI à l'aide de « form-data » ?

Barbara Streisand
Libérer: 2024-12-07 20:30:13
original
471 Les gens l'ont consulté

How to Efficiently Upload Files to a FastAPI Server Using `form-data`?

Téléchargement de fichiers avec FastAPI à l'aide de données de formulaire et SpooledTemporaryFile

Pour télécharger des fichiers à l'aide de FastAPI avec multipart/form-data, il est recommandé d'installer python-multipart car les fichiers en plusieurs parties sont envoyés via form-data.

pip install python-multipart
Copier après la connexion

Voici un exemple amélioré de téléchargement d'un fichier à l'aide de FastAPI :

from fastapi import File, UploadFile
from typing import List

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        # Using file.file for synchronous operations (e.g., opening a file on disk)
        contents = file.file.read()
        with open(file.filename, 'wb') as f:
            f.write(contents)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}
Copier après la connexion

Si vous devez traiter des fichiers plus volumineux par morceaux, envisagez de lire le fichier par incréments plus petits. . Vous pouvez soit utiliser une boucle manuelle :

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        with open(file.filename, 'wb') as f:
            while contents := file.file.read(1024 * 1024):
                f.write(contents)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}
Copier après la connexion

Ou utiliser la méthode shutdown.copyfileobj(), qui lit et écrit les données en morceaux :

from shutil import copyfileobj

@app.post("/upload")
def upload(file: UploadFile = File(...)):
    try:
        with open(file.filename, 'wb') as f:
            copyfileobj(file.file, f)
    except Exception:
        return {"message": "An error occurred while uploading the file."}
    finally:
        file.file.close()

    return {"message": f"Successfully uploaded {file.filename}"}
Copier après la connexion

Notes supplémentaires :

  • FastAPI utilise SpooledTemporaryFile pour le téléchargement de fichiers, qui stocke les données dans mémoire. Pour les fichiers de plus de 1 Mo, les données sont écrites dans un fichier temporaire sur le disque.
  • Si vous définissez un point de terminaison avec une définition asynchrone, utilisez le traitement de fichier asynchrone comme mentionné dans cette réponse : [https://stackoverflow.com/a/69868184/6616846](https://stackoverflow.com/a/69868184/6616846)
  • Pour télécharger plusieurs fichiers, vous pouvez utiliser une liste d'objets UploadFile dans votre fonction de point de terminaison.
  • Pour des exemples de formulaires HTML, reportez-vous aux liens fournis dans l'original réponse.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal