Der Upload von Dateien wird seitens des Benutzerinterfaces mit einem Input-Feld in einem Formular gestaltet. Das Formular muß als HTTP- Übertragungsmethode POST angeben. Das Encoding des Forumlars wird mit dem Type multipart/form-data angebeben.
<FORM action="/upload.php" enctype="multipart/form-data" method="POST"> <input type="file" name="filename" value="*.sxw" > <input type="submit" value="Upload"> </FORM>Beim Abschicken des Formulars erzeugt der Browser einen Request wie im folgenden beschrieben.
Ein Formular mit Fileupload schickt einen speziellen POST-Request an den Server. Der Content-Type des Requests ist multipart/form-data mit einem zusätzlichen Boundary- String. Dieser String dient als Trennmarke, die die einzelnen Werte des abgeschickten Formulars und die übertragene(n) Datei(en) voneinander trennt.
Der Boundary- String darf im eigentlichen Content des Formulars und in den zu übertragenen Dateien nicht vorkommen, da sonst die übertragenen Werte nicht mehr eindeutig zugeordnet werden können. Der Client, in der Regel der Web-Browser errechnet eine zufällige Zeichenkette, die als Boundary eingsetzt wird.
Content-Type: multipart/form-data; boundary=curlt8QjH+fl4hJXNwr7axn9G6Pn44PAchtung! Die '--' des Boundary-Strings werden erst im Body des Requests benötigt.
Der Body des Requests besteht im Gegensatz zum einfachen POST
Request aus mehreren Abschnitten. In jedem dieser Abschnitte wird ein
einzelner Formularparameter oder der Inhalt einer Datei
übertragen. Die Abschnitte werden durch eine Zeile mit dem
Boundary-String (z.B. --curlUbrP7pnAemzkERyg1qsTEtCAWW6
)
voneinander getrennt.
In den einzelnen Feldern des Requests sind Header definiert, die die Verwendung dieses Abschnitts und eventuell den Content-Type definieren. Ein Formularfeld mit dem Namen ACTION und dem Wert storeDocument wird übertragen als:
--curlt8QjH+fl4hJXNwr7axn9G6Pn44P Content-Disposition: form-data; name="ACTION" storeDocumentHierbei wird der Header wie gewohnt mit einer Leerzeile (mit \r\n) vom eigentlichen Content getrennt.
Eine Datei wird in einem Feld übertragen, bei dem der Content-Disposition Header neben dem Feldnamen auch eine Option mit den Dateinamen enthält. Der Content-Type wird für diesen Teil auf multipart/form-data gesetzt.
--curlUbrP7pnAemzkERyg1qsTEtCAWW6 Content-Disposition: form-data; name="angebot"; filename="tpl.tar.gz" Content-Type: multipart/form-data alkjq1aß9081*=alkjakv§!% ... ...Seitens des Servers wird der Request in seine Bestandteile zerlegt und entsprechenden Variablen zugeordnet, auf die der Anwendungsentwickler zugreifen kann.