1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
|
<?xml version="1.0" encoding="iso-8859-1"?>
<chapter id="features.file-upload">
<title>Steuerung von Dateiuploads</title>
<sect1 id="features.file-upload.post-method">
<title>Dateiuploads mit POST</title>
<simpara>
PHP kann Dateiuploads mit jedem RFC-1867
konformen Browser (dazu gehren der Natscape Navigator
3 oder hher, Microsoft Internet Explorer 3 mit Patch von
Microsoft oder hher ohne Patch) durchfhren. Es knnen
sowohl Text- als auch Binrdaten hochgeladen werden.
Mit PHPs Authentifizierungs- und Dateifunktionen besteht
volle Kontrolle darber, wer Dateien hochladen darf und was
mit den Dateien geschehen soll, wenn der Upload beendet ist.
</simpara>
<para>
PHP untersttzt auch Dateiuploads nach der PUT-Methode, die
beispielsweise vom Netscape Composer und den W3C Amaya
Clients benutzt wird. Siehe dazu <link linkend="features.file-upload.put-method">PUT-Untersttzung</link>
fr nhere Informationen.</para>
<para>
Eine Maske fr den Dateiuplod kann erstellt werden, indem man
ein Formular entwirft, was ungefhr so aussieht:
<example>
<title>Formular fr den Dateiupload</title>
<programlisting>
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
</programlisting>
</example>
Die URL sollte auf eine PHP-Datei verweisen. Das versteckte Feld
MAX_FILE_SIZE mu dem Dateieingabefeld vorausgehen und den
Wert der maximal akzeptierten Dateigrsse in Bytes enthalten.
Bei erfolgreichem Upload des Files werden folgende Variablen definiert:
</para>
<para>
<itemizedlist>
<listitem>
<simpara>
$userfile - Der temporre Name, unter dem die hochgeladene Datei
auf demServer gespeichert wurde.
</simpara>
</listitem>
<listitem>
<simpara>
$userfile_name - Der ursprngliche Dateiname auf dem System des
Absenders.
</simpara>
</listitem>
<listitem>
<simpara>
$userfile_size - Gre der hochgeladenen Datei in Bytes.
</simpara>
</listitem>
<listitem>
<simpara>
$userfile_type - Der Mime-Typ der Datei, wenn dies
Information zur Verfgung gestellt wird. Ein Beispiel wre
"image/gif".
</simpara>
</listitem>
</itemizedlist>
Die Variable "$userfile" trgt den Namen des
Dateifeldes im Formular; im obigen Beispiel haben wir die
Bezeichnung "userfile" gewhlt.</para>
<simpara>
Standardmig werden Dateien in dem vorgegebenen temporren
Verzeichnis des Servers gespeichert. Dies kann durch das Setzen
der Umgebungsvariablen <envar>TMPDIR</envar> direkt in der
Umgebung, in der PHP ausgefhrt wird, gendert werden.
Ein Setzen des temporren Verzeichnisses durch die Funktion
<function>putenv</function> innerhalb eines Skriptes
ist nicht mglich.</simpara>
<simpara>
Das PHP-Skript, dem die hochzuladende Datei bergeben wird,
sollte alle ntigen Anweisungen enthalten, die festlegen, wie mit
der hochgeladenen Datei verfahren werden soll. Beispielsweise
kann die $file_size - Variable verwendet werden, um Dateien
auszusortieren, die zu gross oder zu klein sind. Oder man
benutzt die $file_type - Variable, um sich aller Dateien zu entledigen,
die nicht bestimmten Typen entsprechen. Auf jeden Fall sollte
die hochgeladene Datei aus dem temporren Verzeichnis gelscht
oder an andere Stelle verschoben werden.</simpara>
<simpara>
Die Datei wird aus dem temporren Verzeichnis gelscht, sobald
das Skript abgearbeitet ist, wenn sie nicht verschoben oder
umbenannt wurde.</simpara></sect1>
<sect1 id="features.file-upload.common-pitfalls">
<title>Hufige Probleme</title>
<simpara>
Der mit MAX_FILE_SIZE eingestellte Wert kann nicht grsser
sein als der durch die Zeile upload_max_filesize der PHP3.ini (oder
der entsprechenden Zeile php3_upload_max_filesize in der Apache
Konfigurationsdatei) festgelegte. Standardmig sind dies
2 MB.</simpara>
<simpara>
Bitte beachten, da der CERN httpd alles abschneidet, was auf
das erste Leerzeichen im content-type Mime-Header folgt, den
er vom Client erhlt. Solange dies der Fall ist, untersttzt der
CERN httpd keine Dateiuploads.</simpara>
</sect1>
<sect1 id="feature-fileupload.multiple">
<title>Mehrere Dateien uploaden</title>
<simpara>
Es ist mglich, gleichzeitig mehrere Dateien hochzuladen und
die Upload-Informationen automatisch in Arrays aufgefhrt zu
erhalten. Dabei mu im HTML-Formular die gleiche Syntax zum
bermitteln des Arrays benutzt werden, was man durch verschiedene
Select- und Checkboxen erreicht.</simpara>
<note>
<para>
Die Untersttzung fr den Upload mehrerer Dateien wurde in
Version 3.0.10 hinzugefgt.</para>
</note>
<para>
<example>
<title>Formular zum Upload mehrerer Dateien</title>
<programlisting>
<form action="file-upload.html" method="post" enctype="multipart/form-data">
Send these files:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Send files">
</form>
</programlisting>
</example></para>
<simpara>
Wenn das obige Formular abgeschickt wird, werden die Arrays
<computeroutput>$userfile</computeroutput>,<computeroutput>$userfile_name</computeroutput> und
<computeroutput>$userfile_size</computeroutput> fr den globalen
Bereich, wie in $HTTP_POST_VARS, angeordnet. Jede dieser
Variablen ist ein numerisch indizierte Array, das aus den
entsprechenden Werten der bertragenen Dateien besteht.</simpara>
<simpara>
Nehmen wir an, die Dateinamen <filename>/home/test/review.html</filename>
und <filename>/home/test/xwp.out</filename> werden bertragen. In
diesem Fall beinhaltet<computeroutput>$userfile_name[0]</computeroutput>
den Wert <computeroutput>review.html</computeroutput> und
<computeroutput>$userfile_name[1]</computeroutput> enthlt den Wert
<computeroutput>xwp.out</computeroutput>.
Genauso enthlt <computeroutput>$userfile_size[0]</computeroutput>
die Dateigre von <filename>review.html</filename>, und so weiter.</simpara></sect1>
<sect1 id="features.file-upload.put-method">
<title>PUT-Untersttzung</title>
<para>
PHP untersttzt die HTTP PUT-Methode, wie sie von Clients wie Netscape
Composer oder W3C Amaya benutzt wird. PUT-Anfragen sind weitaus
unkomplizierter als ein Dateiupload und sehen etwa so aus:
<informalexample><programlisting>
PUT /path/filename.html HTTP/1.1
</programlisting></informalexample>
</para>
<para>
Das wrde normalerweise bedeuten, da der entfernte Client den
folgenden Inhalt als /path/filename.html im Webverzeichnisbaum
speichert. Natrlich ist es keine gute Idee, dass PHP oder
Apache jeden Benutzer beliebige Dateien berschreiben lassen.
Um eine solche Anfrage bearbeiten zu knnen, muss der Webserver
erst angewiesen werden, ein bestimmtes PHP-Skript fr die
Abarbeitung aufzurufen. Im Apache wird dies durch die
<emphasis>Script</emphasis> - Direktrive festgelegt. Sie kann
irgendwo in der Apache-Konfigurationsdatei plaziert werden,
gebruchlich ist die Plazierung innerhalb einer <Directory>- oder
<Virtualhost>- Sektion. Eine Zeile wie die folgende erledigt dies:
<informalexample><programlisting>
Script PUT /put.php3
</programlisting></informalexample>
</para>
<simpara>
Diese Zeile legt fest, da Apache alle PUT-Anfragen fr URIs, die
dem Kontext entsprechen, in dem diese Zeile steht, an das put.php3
Skript weiterleitet. Dies setzt voraus, da PHP aktiv und fr die
.php3-Dateierweiterung registriert ist.
</simpara>
<simpara>
Innerhalb der put.php3-Datei knnte folgendes stehen:
</simpara>
<para>
<informalexample><programlisting>
<? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>
</programlisting></informalexample>
</para>
<simpara>
Dies kopiert die Datei an den vom Client angegebenen Ort.
Mglicherweise sollen vor dem Kopieren der Datei noch
berprfungen und/oder Benutzerauthentifizierung stattfinden. Wenn
PHP eine PUT-Anfrage erhlt, wird die Datei in einem temporren
Verzeichnis gespeichert, genau wie bei <link
linkend="features.file-upload.post-method">POST-Methode</link>
Nach Abarbeiten der Anfrage wird die temporre Datei gelscht.
Also mu das PHP-Skript, das die PUT-Anfrage bearbeitet, die Datei
irgendwohin kopieren. Der Name der temporren Datei findet sich in
der Variablen $PHP_PUT_FILENAME; der Name der zu speichernden
Datei steht in $REQUEST_URI (kann bei Nicht-Apache Webservern
variieren). Dieser Zieldateiname wird vom Client festgelegt. Man
kann den Client auch umgehen; beispielsweise knnten alle
hochgeladenen Dateien in ein spezielles Upload-Directory kopiert
werden.
</simpara>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|