Mit `File` können sie vom Client hochzuladende Dateien definieren.
Sie können Dateien, die vom Client hochgeladen werden, mithilfe von `File` definieren.
/// info
/// info | Info
Um hochgeladene Dateien zu empfangen, installieren Sie zuerst <ahref="https://andrew-d.github.io/python-multipart/"class="external-link"target="_blank">`python-multipart`</a>.
Um hochgeladene Dateien zu empfangen, installieren Sie zuerst <ahref="https://github.com/Kludex/python-multipart"class="external-link"target="_blank">`python-multipart`</a>.
Z. B. `pip install python-multipart`.
Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann das Paket installieren, zum Beispiel:
Das, weil hochgeladene Dateien als „Formulardaten“ gesendet werden.
```console
$ pip install python-multipart
```
Das liegt daran, dass hochgeladene Dateien als „Formulardaten“ gesendet werden.
///
## `File` importieren
## `File` importieren { #import-file }
Importieren Sie `File` und `UploadFile` von `fastapi`:
`File` ist eine Klasse, die direkt von `Form` erbt.
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben.
///
/// tip | Tipp
Um Dateibodys zu deklarieren, müssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden würden.
Um Dateibodys zu deklarieren, müssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body(JSON)-Parameter interpretiert werden würden.
///
@ -46,7 +50,7 @@ Bedenken Sie, dass das bedeutet, dass sich der gesamte Inhalt der Datei im Arbei
Aber es gibt viele Fälle, in denen Sie davon profitieren, `UploadFile` zu verwenden.
## Datei-Parameter mit `UploadFile`
## Datei-Parameter mit `UploadFile` { #file-parameters-with-uploadfile }
Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
@ -55,20 +59,20 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
`UploadFile` zu verwenden, hat mehrere Vorzüge gegenüber `bytes`:
* Sie müssen `File()` nicht als Parameter-Defaultwert verwenden.
* Es wird eine <abbrtitle='Aufgespult, Warteschlangenartig'>„Spool“</abbr>-Datei verwendet:
* Es wird eine „gespoolte“ Datei (deutsch: warteschlangenartig) verwendet:
* Eine Datei, die bis zu einem bestimmten Größen-Limit im Arbeitsspeicher behalten wird, und wenn das Limit überschritten wird, auf der Festplatte gespeichert wird.
* Das bedeutet, es wird für große Dateien wie Bilder, Videos, große Binärdateien, usw. gut funktionieren, ohne den ganzen Arbeitsspeicher aufzubrauchen.
* Sie können Metadaten aus der hochgeladenen Datei auslesen.
* Es hat eine <abbrtitle="dateiartig"><ahref="https://docs.python.org/3/glossary.html#term-file-like-object"class="external-link"target="_blank">file-like</a></abbr>`async`hrone Schnittstelle.
* Es stellt ein tatsächliches Python-<abbrtitle="Warteschlangenartige, temporäre Datei"><ahref="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile"class="external-link"target="_blank">`SpooledTemporaryFile`</a></abbr>-Objekt bereit, welches Sie direkt anderen Bibliotheken übergeben können, die ein dateiartiges Objekt erwarten.
* Es hat eine <ahref="https://docs.python.org/3/glossary.html#term-file-like-object"class="external-link"target="_blank">dateiartige</a>`async`hrone Schnittstelle.
* Es stellt ein tatsächliches Python-<ahref="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile"class="external-link"target="_blank">`SpooledTemporaryFile`</a>-Objekt bereit, welches Sie direkt anderen Bibliotheken übergeben können, die ein dateiartiges Objekt erwarten.
### `UploadFile`
### `UploadFile` { #uploadfile }
`UploadFile` hat die folgenden Attribute:
* `filename`: Ein `str` mit dem ursprünglichen Namen der hochgeladenen Datei (z. B. `meinbild.jpg`).
* `content_type`: Ein `str` mit dem Inhaltstyp (MIME-Typ / Medientyp) (z. B. `image/jpeg`).
* `file`: Ein <ahref="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile"class="external-link"target="_blank">`SpooledTemporaryFile`</a> (ein <ahref="https://docs.python.org/3/glossary.html#term-file-like-object"class="external-link"target="_blank">file-like</a> Objekt). Das ist das tatsächliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken übergeben können, welche ein „file-like“-Objekt erwarten.
* `file`: Ein <ahref="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile"class="external-link"target="_blank">`SpooledTemporaryFile`</a> (ein <ahref="https://docs.python.org/3/glossary.html#term-file-like-object"class="external-link"target="_blank">dateiartiges</a> Objekt). Das ist das tatsächliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken übergeben können, welche ein „file-like“-Objekt erwarten.
`UploadFile` hat die folgenden `async`hronen Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird).
@ -79,7 +83,7 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
* Das ist besonders dann nützlich, wenn Sie `await myfile.read()` einmal ausführen und dann diese Inhalte erneut auslesen müssen.
* `close()`: Schließt die Datei.
Da alle diese Methoden `async`hron sind, müssen Sie sie `await`en („erwarten“).
Da alle diese Methoden `async`hron sind, müssen Sie sie „await“en („erwarten“).
Zum Beispiel können Sie innerhalb einer `async`*Pfadoperation-Funktion* den Inhalt wie folgt auslesen:
@ -105,9 +109,9 @@ Wenn Sie die `async`-Methoden verwenden, führt **FastAPI** die Datei-Methoden i
///
## Was sind „Formulardaten“
## Was sind „Formulardaten“ { #what-is-form-data }
HTML-Formulare (`<form></form>`) senden die Daten in einer „speziellen“ Kodierung zum Server, welche sich von JSON unterscheidet.
Der Weg, wie HTML-Formulare (`<form></form>`) die Daten zum Server senden, verwendet normalerweise eine „spezielle“ Kodierung für diese Daten. Diese unterscheidet sich von JSON.
**FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten.
@ -117,7 +121,7 @@ Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem <
Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss.
Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen Sie die <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST"class="external-link"target="_blank"><abbrtitle="Mozilla Developer Network – Mozilla-Entwickler-Netzwerk">MDN</abbr>-Webdokumentation für <code>POST</code></a>.
Wenn Sie mehr über diese Kodierungen und Formularfelder lesen möchten, besuchen Sie die <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST"class="external-link"target="_blank"><abbrtitle="Mozilla Developer Network">MDN</abbr>-Webdokumentation für `POST`</a>.
///
@ -129,19 +133,19 @@ Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls.
@ -121,7 +121,7 @@ Data from forms is normally encoded using the "media type" `application/x-www-fo
But when the form includes files, it is encoded as `multipart/form-data`. If you use `File`, **FastAPI** will know it has to get the files from the correct part of the body.
If you want to read more about these encodings and form fields, head to the <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST"class="external-link"target="_blank"><abbrtitle="Mozilla Developer Network">MDN</abbr> web docs for <code>POST</code></a>.
If you want to read more about these encodings and form fields, head to the <ahref="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST"class="external-link"target="_blank"><abbrtitle="Mozilla Developer Network">MDN</abbr> web docs for `POST`</a>.