Diskussion:PHP/Tutorials/File Upload/Vorschlag

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Hinweis

Eine Diskussionsseite dient dazu, Änderungen am Artikel zu besprechen. Allerdings werden diese Seiten in unserem Wiki erfahrungsgemäß nur von sehr wenigen Leuten besucht.
  • Deshalb sollten Diskussionen über den Artikel zum Thema „Vorschlag“ besser im SELFHTML-Forum geführt werden.
  • Unter https://forum.selfhtml.org/self/new kannst du einen entsprechenden Beitrag erstellen.
  • Bitte hinterlasse einen entsprechenden Link auf dieser Diskussionsseite, wenn du einen Thread im Forum eröffnet hast.

In vielen Situationen erscheint es notwendig, mittels HTML-Formular auch Dateien an den Server zu übertragen, also sogenannte Uploads durchzuführen. Hierbei kann es sich um Bilder zum Text, um mitzuliefernde Textdateien, Office-Dokumente oder auch HTML-Seiten oder sogar ausführbare Scripte handeln. Beliebige andere Datenfiles sind denkbar.

Oft wird dabei leider übersehen, dass man sich durch die Bereitstellung eines File-Uploads eine Sicherheitslücke in seinen Server reißen kann.


Verfahren[Bearbeiten]

Client[Bearbeiten]

Die Übermittlung findet in der Regel mit den Protokollen HTTP oder HTTPS statt. Für beide Protokolle stehen zwei Methoden (POST, PUT) zur Verfügung, von denen meistens nur die POST-Methode implementiert ist.

POST[Bearbeiten]

Bei der Post-Methode verpackt der Browser alle zu übermittelnden Daten in einem Post-Request. Zur Übermittlung von Files benötigt PHP hier auf der Server-Seite den MIME-Encryption-Type multipart/form-data, sodass man den Browser auch auf der Client-Seite dazu anweisen muss, diesen zu benutzen.

HTML-Formular[Bearbeiten]

In einer HTML-Seite notiert man dazu ein <form>-Element, das seinerseits das <input>-Element vom Typ file enthält. Es fehlt nun nur noch die Möglichkeit, die Übertragung auszulösen. Dies geschieht am einfachsten durch Hinzufügen eines <input>-Elementes vom Typ submit. Mehr ist auf der Clientseite nicht notwendig.

Die „Zutatenliste“ enthält also:

  • ein <form>-Element mit den Attributen
    • action
    • method
    • enctype
  • zwei <input>-Elemente
    • Typ file mit Attribut name
    • Typ submit mit Attribut name
– Das Formular und seine Darstellung im Browser
Ausschnitt aus dem HTML-Formular:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="dateiupload"> <input type="submit" name="btn[upload]"> </form>
So sieht es im Browserfenster aus:
PHP Upload-Formular.jpg
Der Firefox-Browser erzeugt ein Eingabefeld, einen Durchsuchen-Button und einen Button mit der Beschriftung „Daten absenden“. Diesen Text ergänzt er selbsttätig, weil wir kein Value-Attribut für den Button angebegen haben. Mit einem value="mein_Text" kann man dem Submit-Button auch einen eigenen Text zuweisen.
Request[Bearbeiten]

Beim Absenden erzeugt der Browser einen solchen Request:

Beispiel
Ziel-Adresse: http://testserver.lan/upload/Artikel/upload.php
POST /upload/Artikel/upload.php HTTP/1.1 Host: testserver.lan ... (gekürzt) Content-Type: multipart/form-data; boundary=---------------------------20037128598723 Content-Length: 384 -----------------------------20037128598723 Content-Disposition: form-data; name="dateiupload"; filename="hallowelt.php" Content-Type: application/octet-stream <?php #### hallowelt.php #### echo "Hallo Welt!"; ?> -----------------------------20037128598723 Content-Disposition: form-data; name="btn[upload]" Daten absenden -----------------------------20037128598723--

Wie man aus dem Mitschnitt der HTTP-Header sehen kann, findet der HTTP-Upload im Klartext statt. Dateien werden vom Browser als simpler Bytestream eingebunden. Der Server hat hier nur über die Boundary die Möglichkeit, das Ende der übertragenen Datei (hier das für die Kontrolle benutzte PHP-Script) zu erkennen.

Die Antwort (Response) des Servers ist an dieser Stelle nicht weiter interessant. Wenn Sie wollen, können Sie sich über die Einzelheiten des Protokolls HTTP im Kapitel HTTP informieren. Bevor der Server jedoch eine Response senden kann, muss er die ankommenden Daten verarbeiten, was im Folgenden thematisiert wird.

Server[Bearbeiten]