Mit dieser Funktion können Benutzer Text- und Binärdateien hochladen. Mithilfe der Authentifizierungs- und Dateioperationsfunktionen von PHP können Sie vollständig steuern, wer hochladen darf und wie die Datei nach dem Hochladen verarbeitet wird.
PHP kann Dateien akzeptieren, die von jedem Browser hochgeladen werden, der dem RFC-1867-Standard entspricht (einschließlich Netscape Navigator 3 und höher, gepatchter Microsoft Internet Explorer 3 oder höher).
Hinweis: Zugehörige Einstellungen
finden Sie in den Einstellungsoptionen file_uploads, upload_max_filesize, upload_tmp_dirpost_max_size und max_input_time von php.ini.
Beispiel #1 Datei-Upload-Formular
Sie können ein spezielles Formular zur Unterstützung des Datei-Uploads wie folgt erstellen:
<!-- The data encoding type, enctype, MUST be specified as below --> <form enctype="multipart/form-data" action="__URL__" method="POST"> <!-- MAX_FILE_SIZE must precede the file input field --> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!-- Name of input element determines name in $_FILES array --> Send this file: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form>
Die __URL__ im obigen Beispiel sollte durch ersetzt werden zeigen Sie auf eine echte PHP-Datei.
Das versteckte Feld MAX_FILE_SIZE (Einheit: Bytes) muss vor dem Dateieingabefeld platziert werden und sein Wert ist die maximale Größe der empfangenen Datei. Dies ist eine Empfehlung für Browser, PHP prüft dies ebenfalls. Diese Einstellung kann browserseitig einfach umgangen werden. Erwarten Sie also nicht, diese Funktion zum Blockieren großer Dateien zu verwenden. Tatsächlich läuft die maximale Upload-Dateigröße in den PHP-Einstellungen nicht ab. Es ist jedoch besser, dieses Element dem Formular hinzuzufügen, da dadurch vermieden werden kann, dass Benutzer lange auf das Hochladen großer Dateien warten müssen und dann feststellen, dass die Datei zu groß ist und der Upload fehlschlägt.
Hinweis:
Stellen Sie sicher, dass das Attribut des Datei-Upload-Formulars enctype="multipart/form-data" lautet, andernfalls kann die Datei nicht hochgeladen werden.
Globale Variable $_FILES existiert seit PHP 4.1.0 (in früheren Versionen durch $HTTP_POST_FILES ersetzt). Dieses Array enthält Informationen zu allen hochgeladenen Dateien.
Der Inhalt des $_FILES-Arrays im obigen Beispiel ist wie folgt. Wir gehen davon aus, dass der Name des Datei-Upload-Felds „userfile“ lautet, wie im obigen Beispiel gezeigt. Der Name kann beliebig sein.
$_FILES['userfile']['name']
Der ursprüngliche Name der Client-Maschinendatei.
$_FILES['userfile']['type']
Der MIME-Typ der Datei, wenn der Browser diese Informationen bereitstellt. Ein Beispiel ist „image/gif“. Allerdings wird dieser MIME-Typ auf PHP-Seite nicht überprüft, Sie sollten ihn also nicht als selbstverständlich ansehen.
$_FILES['userfile']['size']
Die Größe der hochgeladenen Datei in Bytes.
$_FILES['userfile']['tmp_name']
Der temporäre Dateiname, der nach dem Hochladen der Datei auf dem Server gespeichert wird.
$_FILES['userfile']['error']
Fehlercode im Zusammenhang mit dem Datei-Upload. Dieses Projekt wurde in PHP Version 4.2.0 hinzugefügt.
Nachdem die Datei hochgeladen wurde, wird sie standardmäßig im temporären Standardverzeichnis des Servers gespeichert, es sei denn, upload_tmp_dir in php.ini ist auf einen anderen Pfad eingestellt. Das standardmäßige temporäre Verzeichnis auf der Serverseite kann durch Ändern der Umgebungsvariablen TMPDIR der PHP-Laufumgebung zurückgesetzt werden, aber das Festlegen durch Ausführen der Funktion putenv() im PHP-Skript hat keine Auswirkung. Diese Umgebungsvariable kann auch verwendet werden, um zu bestätigen, dass auch andere Vorgänge für die hochgeladene Datei ausgeführt werden.
Beispiel #2 Datei-Upload aktivieren
Bitte überprüfen Sie die Funktionen is_uploaded_file() und move_uploaded_file() für weitere Informationen. Das folgende Beispiel behandelt den von einem Formular bereitgestellten Datei-Upload.
<?php // 在PHP4.1.0版本以前, 应该使用$HTTP_POST_FILES来替代$_FILES. $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre class="brush:php;toolbar:false">'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "Possible file upload attack!\n"; } echo 'Here is some more debugging info:'; print_r($_FILES); print ""; ?>
Ein PHP-Skript, das eine hochgeladene Datei akzeptiert, sollte alle logisch notwendigen Prüfungen implementieren, um zu entscheiden, welche Vorgänge als nächstes mit der Datei ausgeführt werden sollen. Sie können beispielsweise die Variable $_FILES['userfile']['size'] verwenden, um zu große oder zu kleine Dateien auszuschließen, oder Sie können die Variable $_FILES['userfile']['type'] verwenden, um Schließen Sie Dateitypen und bestimmte Standards aus, die nicht übereinstimmen, betrachten Sie dies jedoch nur als ersten Schritt in einer Reihe von Überprüfungen, da dieser Wert vollständig vom Client gesteuert wird und nicht auf der PHP-Seite überprüft wird. Seit PHP 4.2.0 können Sie auch die Variable $_FILES['userfile']['error'] verwenden, um den nächsten Schritt anhand verschiedener Fehlercodes zu planen. Löschen Sie in jedem Fall die Datei aus dem temporären Verzeichnis oder verschieben Sie sie an einen anderen Ort.
Wenn im Formular keine hochgeladene Datei ausgewählt ist, ist der Wert der PHP-Variablen $_FILES['userfile']['size'] 0 und $_FILES['userfile']['tmp_name'] wird null sein.
Wenn die Datei nicht an einen anderen Ort verschoben oder umbenannt wurde, wird sie am Ende der Formularanforderung gelöscht.
Beispiel #3 Hochladen eines Arrays von Dateien
Die HTML-Array-Funktion von PHP unterstützt sogar Dateitypen.
<form action="" method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form>
<?php foreach ($_FILES["pictures"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?>