Dateien per Userinterface hochladen
Um Dateien per Userinterface hochladen zu können, benötigt man vergleichbar wenige Kenntnisse in der Programmiersprache PHP
2004-02-15 22:52:43 2004-02-15 22:52:43 Lukas Beck
Zunächst ist es sinnvoll, zu überprüfen, ob die
Einstellungen Ihres Providers oder auch Ihres eigenen (lokalen) Webservers einen
PHP Upload zulassen. Zudem ist die maximal hochladbare Dateigröße durch die
Befehlszeile UPLOAD_MAX_FILESIZE in der Datei
PHP.INI, die Sie in Ihrem PHP Ordner finden, von
Ihrem Provider oder Ihrer lokalen PHP.INI
vorbestimmt, meistens mit 2MB oder auch 8MB. Über diese Größe hinaus können Sie
dann keine Dateien hochladen.
Wobei gerade hier auch der Wert der Zeile POST_MAX_SIZE
entscheidend ist.
Zudem muss natürlich der Upload generell zugelassen werden - auch diese
Befehlszeile findem Sie in der PHP.INI - sie heisst
FILE_UPLOADS und muss entsprechend auf
ON gesetzt sein, damit Sie das Script anwenden
können.
Auslesen können Sie diese Informationen, indem Sie die Funktion
phpinfo(); auf dem Server ausgeben. Wenn Sie die
Rechte haben, Änderungen an PHP.INI durchzuführen
und dies beabsichtigen, so bedenken Sie, dass Sie, sofern Apache als Dienst
läuft, diesen nach jeder Änderung neu starten müssen, damit die Änderungen
wirksam werden.
Zunächst behandeln wir das grundsätzliche Formular, über das wir die Datei hochladen möchten. Dieses können wir, wie hier gezeigt ohne PHP ausgeben, da es sich um ein statisches Formular handelt. Somit entlasten wir den Server und erhöhen zudem die Ausgabegeschwindigkeit. Im FORM Tag wir angegeben, dass jedes beliebige Dateiformat hochgeladen werden kann. Mit dem HIDDEN Tag MAX_FILE_SIZE bestimmen wir, falls gewollt, die maximal hochladbare Dateigröße
<form enctype="multipart/form-data" action="upload.php"
method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="5000">
<input type="file" name="datei"><br>
<input type="submit" value="hochladen">
</form>
Kommen wir zum Teil des Uploads. Um zu verhindern, dass leere Dateizeilen an den Server gesendet werden, prüfen wir zunächst auf ein ausgefülltes Formular mittels der Funktion empty();
<?php
if(!empty($datei))
{
...
?>
Wir übergeben den Dateinamen, den wir mit $datei_name
auslesen können an eine neue Variable $dateiname,
was später noch eine nützliche Vorraussetzung für die Weiterverarbeitung des
Scriptes ist.
Ist also das Formular ausgefüllt, so wird das Script weiterverarbeitet. Um zu
vermeiden, dass wir ungewollt Dateien gleichen Names überschreiben, prüfen wir
zunächst mit dem Befehl file_exists(); ob die Datei
bereits vorhanden ist.
Hier kommt nun die Funktion check_datei(); zum
Einsatz, die die Datei umbenennt, sollte sie bereits vorhanden sein. Auf die
Funktion komme ich selbstverständlich genauer zurück, hierzu jedoch später im
Tutorial mehr.
<?php
$dateiname = $datei_name;
if(file_exists($datei_name))
{
check_datei();
echo "Die Datei mit dem Dateinamen <b>$datei_name</b> existierte bereits.<br> Ihre Datei wurde in
<b>$dateiname</b> umbenannt";
...
?>
Falls wir Gebrauch von einem HIDDEN
Formularfeld machen, in dem wir die maximale Dateigröße bestimmen, testen wir an
dieser Stelle, ob die Datei den Anforderungen entspricht. Die Größe der Datei
lesen wir, wie schon bei $datei_name mit
$datei_size aus - die Variable $datei kann
natürlich variieren. Sollten wir keine Dateigrößenbegrenzung in unserem Script
haben, können wir diesen Teil ignorieren, dennoch darf die Datei nicht größer
sein, als in PHP.INI vordefiniert - diesen Wert
können wir hier im Formular nicht beeinflussen. Beachten Sie jedoch, wenn Sie
eine Beschränkung seitens PHP.INI von
beispielsweise 2MB vordefiniert haben, so gibt das Script unter Umständen dem
User keinen Fehler bezüglich einer zu großen Datei aus, der User weiss also
nicht, wo der Fehler lag, da die Dateigröße von PHP.INI abgelehnt wurde. Es ist also sinnvoll, dieses HIDDEN Feld einzubauen, oder zumindest eine statische Angabe der
maximalen Dateigröße zu machen, um den User nicht im Dunkeln zu lassen, falls
dieser versucht, eine Datei größer als die Vordefinition, hochzuladen.
Merken Sie sich auch den Hinweis von PHP, dass die maximale Dateigröße
MAX_FILE_SIZE lediglich ein Hinweis für den Browser
ist und diese Grenze umgangen werden kann. Die PHP-Einstellungen für die
maximale Dateigröße können nicht getäuscht werden. (php.net)
<?php
if($datei_size > $MAX_FILE_SIZE)
{
echo "Die Datei ist zu groß, die maximale Dateigrösse beträgt $MAX_FILE_SIZE Byte(s)";
}
else
{
...?>
Die nun beschriebene Zeile ist der eigentliche Code, der
wirklich nur eine einzige Zeile beträgt. copy();
Die hochgeladene Datei wird mit copy(); lediglich
vom temporären Ort in den eigentlich gewünschten Ordner kopiert, in dem
Falle ist der Ordner gleich dem Ordner, in dem sich das upload.php Script
befindet. Möchte man einen anderen Ordner bestimmen, so könnte das entsprechend
so aussehen: copy($datei,"/ordner/$dateiname");
Sobald das Script abgearbeitet ist, wird die Datei automatisch am temporären Ort
gelöscht, hierum brauchen wir uns nicht kümmern.
copy($datei,"$dateiname");
Nun sollte die Datei erfolgreich hochgeladen sein, dies überprüfen wir sicherheitshalber noch mit der bereits kennengelernten Funktion file_exists(); - ist die Datei vorhanden, so geben wir eine erfolgreiche Statusmeldung aus, ist dies nicht der Fall, muss folglich ein Fehler aufgetreten sein. Das Script ist abgeschlossen
<?php
if(file_exists($dateiname))
{
echo "<br>Die Datei <b>$datei_name</b> wurde mit <b>$datei_size Byte</b> erfolgreich
hochgeladen";
}
elseif(!file_exists($dateiname))
{
echo "Die Datei ist nicht vorhanden";
}
?>
Die Funktion check_datei();
Eine wichtige Funktion im Script stellt die Funktion check_datei(); dar. Diese verhindert, dass Dateien überschrieben werden. Ich habe dieses Problem über eine rekursive Funktion gelöst. Wichtig! Diese Datei muss am Anfang des Scripts aufgeführt werden, am besten direkt nach dem einführenden <?php Tag!
Hier ist es nun entscheidend, dass wir, wie zuvor gezeigt,
die Variable $datei_name an $dateiname
übergeben haben. Beide definieren wir als globale Variablen. Zunächst legen wir
den $backupstring fest, dieser ist wie hier von mir
als "copy_of_" definiert, dies kann natürlich auch bei Ihnen anders lauten. Die
Funktion wird, wie oben gezeigt, dann eingesetzt, wenn bereits durch file_exists(); festgestellt wurde, dass bereits eine gleichnamige Datei
existiert. Somit hängen wir in diesem Falle den Zusatzstring
$backupstring durch eine Zeichenverkettung an, die
wie zu sehen ist, lautet $backupstring."$dateiname";
Nun taucht jedoch ein weiteres Problem auf: Was tun, wenn auch bereits diese
Datei schon einmal vorhanden ist? Hier kommt der rekursive Funktionsteil zum
Einsatz. Wir überprüfen auch in der Funktion und nach Anhängen des Zusatzstrings
$backupstring, ob auch diese Datei bereits exitiert.
Diese Überpfrüfung wird solange durchgeführt (rekursiv), bis dies nicht mehr der
Fall ist. Solange durchläuft das Script also die Funktion check_datei(); Die Datei wird also in keinem Fall überschrieben, sondern
bekommt einen Anhang des Dateinamens, hier "copy_of_";
<?php
function check_datei()
{
global $datei_name, $dateiname;
$backupstring = "copy_of_";
$dateiname = $backupstring."$dateiname";
if(file_exists($dateiname))
{
check_datei();
}
}
?>
Hier noch einmal das Script in seinem Ganzen:
Dateiname: "upload.php
<form enctype="multipart/form-data"
action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="5000">
<input type="file" name="datei"><br>
<input type="submit" value="hochladen">
</form>
<?php
function check_datei()
{
global $datei_name, $dateiname;
$backupstring = "copy_of_";
$dateiname = $backupstring."$dateiname";
if(file_exists($dateiname))
{
check_datei();
}
}
if(!empty($datei))
{
$dateiname = $datei_name;
if(file_exists($datei_name))
{
check_datei();
echo "Die Datei mit dem Dateinamen <b>$datei_name</b> existierte bereits.<br> Ihre Datei wurde in <b>$dateiname</b> umbenannt";
}
if($datei_size > $MAX_FILE_SIZE)
{
echo "Die Datei ist zu groß, die maximale Dateigrösse beträgt $MAX_FILE_SIZE Byte(s)";
}
else
{
copy($datei,"$dateiname");
if(file_exists($dateiname))
{
echo "<br>Die Datei <b>$datei_name</b> wurde mit <b>$datei_size Byte</b> erfolgreich hochgeladen";
}
elseif(!file_exists($dateiname))
{
echo "Die Datei ist nicht vorhanden";
}
}
}
?>
Ratings
Here you can write a comment
Related topics
PHP cURL Tutorial: Using cURL to Make HTTP Requests
cURL is a powerful PHP extension that allows you to communicate with different servers using various protocols, including HTTP, HTTPS, FTP, and more. ...
Autor :
TheMax
Category:
PHP-Tutorials
E-Mailprüfung mit JavaScript
In diesem Tutorial wird gezeigt, wie eine E-Mailüberprüfung in JavaScript realisiert werden kann ...
Autor :
andy@
Category:
Other tutorials
phpinfo() shows nothing
Today I want to show you how to output the phpinfo(). ...
Autor :
Webmasterfreaky
Category:
PHP-Tutorials
Unkaputtbare Hyperlinks
Wer das Publizieren im Internet nicht bloß als technische Spielerei oder gar eine Designtätigkeit auffasst, wird automatisch ein digitaler Bibliothekar ...
Autor :
chris@
Category:
PHP-Tutorials
Reguläre Ausdrücke
In diesem Tutorial wird erklärt, wie reguläre Ausdrücke aufgebaut sind, was die Metacharaktere (Zeichen mit spezieller Bedeutung) eines Patterns bedeuten, und wie man das ganze in PHP umsetzt. Es werden nur die wichtigsten Teile erklärt, für weiterführend ...
Autor :
webmaster2@
Category:
PHP-Tutorials
Fortschrittsbalkens mit PHP
ProgressClass stellt eine PHP-Klasse für die dynamische Anzeige und Veränderung eines Fortschrittsbalkens zur Verfügung. ...
Autor :
what@
Category:
PHP-Tutorials