Heim >Backend-Entwicklung >Python-Tutorial >Wie lade ich Dateien mithilfe von „form-data' effizient auf einen FastAPI-Server hoch?

Wie lade ich Dateien mithilfe von „form-data' effizient auf einen FastAPI-Server hoch?

Barbara Streisand
Barbara StreisandOriginal
2024-12-07 20:30:13482Durchsuche

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

Hochladen von Dateien mit FastAPI unter Verwendung von form-data und SpooledTemporaryFile

Um Dateien mit FastAPI mit multipart/form-data hochzuladen, wird die Installation empfohlen Python-Multipart, da Multipart-Dateien per gesendet werden form-data.

pip install python-multipart

Hier ist ein verbessertes Beispiel für das Hochladen einer Datei mit 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}"}

Wenn Sie größere Dateien in Blöcken verarbeiten müssen, sollten Sie die Datei in kleineren Schritten lesen . Sie können entweder eine manuelle Schleife verwenden:

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

Oder verwenden Sie die Methode „shutil.copyfileobj()“, die Daten in Blöcken liest und schreibt:

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

Zusätzliche Hinweise :

  • FastAPI verwendet SpooledTemporaryFile für den Datei-Upload, der Daten im Speicher speichert. Bei Dateien, die größer als 1 MB sind, werden die Daten in eine temporäre Datei auf der Festplatte geschrieben.
  • Wenn Sie einen Endpunkt mit async def definieren, verwenden Sie die asynchrone Dateiverarbeitung, wie in dieser Antwort erwähnt: [https://stackoverflow.com/a/69868184/6616846](https://stackoverflow.com/a/69868184/6616846)
  • Zum Hochladen mehrerer Dateien können Sie eine Liste von UploadFile-Objekten in verwenden Ihre Endpunktfunktion.
  • Beispiele für HTML-Formulare finden Sie unter den im Original bereitgestellten Links Antwort.

Das obige ist der detaillierte Inhalt vonWie lade ich Dateien mithilfe von „form-data' effizient auf einen FastAPI-Server hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn