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
Barbara Streisandoriginal
2024-12-07 20:30:13515parcourir

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

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}"}

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}"}

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}"}

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!

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