Maison >développement back-end >Tutoriel Python >Pourquoi mon téléchargement de fichier FastAPI est-il toujours vide et comment puis-je y remédier ?

Pourquoi mon téléchargement de fichier FastAPI est-il toujours vide et comment puis-je y remédier ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 06:53:06808parcourir

Why is my FastAPI file upload always empty, and how can I fix it?

Comment télécharger un fichier à l'aide de FastAPI ?

Problème :

Lors de la tentative de téléchargement d'un fichier à l'aide de FastAPI selon les documentation officielle, la variable file2store est systématiquement vide. De rares cas de récupération réussie d'octets de fichiers se produisent, mais cela est rare.

Solution :

1. Installez Python-Multipart :

Pour activer le téléchargement de fichiers, qui sont transmis sous forme de « données de formulaire », installez python-multipart si vous ne l'avez pas déjà fait :

pip install python-multipart

2. Utilisez l'attribut .file pour le téléchargement d'un seul fichier :

Utilisez l'attribut .file de l'objet UploadFile pour obtenir le fichier Python réel (c'est-à-dire SpooledTemporaryFile). Cela vous permet d'appeler des méthodes comme .read() et .close().

Exemple :

from fastapi import File, UploadFile

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

    return {"message": f"Successfully uploaded {file.filename}"}

3. Gérer les fichiers volumineux :

Utilisez des morceaux si le fichier dépasse la limite de mémoire de 1 Mo. Ajustez la taille du morceau si nécessaire.

4. Lecture/écriture asynchrone :

Si votre point de terminaison nécessite une définition asynchrone, utilisez des méthodes asynchrones pour lire et écrire le contenu du fichier.

5. Télécharger plusieurs fichiers :

@app.post("/upload")
def upload(files: List[UploadFile] = File(...)):
    for file in files:
        try:
            contents = file.file.read()
            with open(file.filename, 'wb') as f:
                f.write(contents)
        except Exception:
            return {"message": "Error uploading file(s)."}
        finally:
            file.file.close()

    return {"message": f"Successfully uploaded {[file.filename for file in files]}."}

6. Exemple de formulaire HTML :

Référez-vous au lien fourni pour un exemple de formulaire HTML pour télécharger des fichiers.

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