WWW-Programmierung II, Vorlesung 9

<- Vorlesung 8 Übungen Vorlesung 10 ->


29) Dateien auf den Server laden

Bei Formularen ist es oftmals gewünscht, Dateien auf den Server übertragen zu können. Dies ist ab Netscape 3 und Internet Explorer 4 in den Browsern vorgesehen. Damit dies möglich ist, sollte das HTML-Formular so aussehen:
	<form enctype="multipart/form-data" action="x.php" method=POST>
		<input TYPE="hidden" name="MAX_FILE_SIZE" value="1000000">
		Ihr Name: <input name="sendername"> <br>
		Dateiname: <input name="geschicktedatei" type="file"><br>
		<input type="submit">
	</form>
Es können auch mehrere Felder vom Typ file vorhanden sein. Entscheidend ist, daß in <form> die Attribute enctype="multipart/form-data" und method=POST angegeben werden.

Der Wert des versteckten Feldes "MAX_FILE_SIZE" gibt die maximale Größe der Datei in Bytes an. Ist die Datei größer, so wird sie nicht akzeptiert. Nach dem Versenden der Datei sind - in unserem Beispiel in der Datei x.php mehrere PHP-Variable gesetzt, die Information über die übertragene Datei beinhalten. Sie beginnen alle mit dem Namen des Datei-Feldes im Formular (+ vorangestelltes Dollarzeichen), in unserem Fall also $geschicktedatei. Folgende Variable sind gesetzt:

Direkt nach der Übertragung liegt die Datei nicht unter dem ursprünglichen Namen auf dem Server. Um sie weiterverarbeiten zu können, können wir die Datei wieder auf ihren ursprünglichen Namen zurückkopieren.
	if (isset($geschicktedatei)) {
		echo "$geschicktedatei<br>\n";
		echo "$geschicktedatei_name<br>\n";
		echo "$geschicktedatei_size<br>\n";
		echo "$geschicktedatei_type<br>\n";
		copy($geschicktedatei,"/tmp/".$geschicktedatei_name);
	}

In der systemweiten PHP-Konfigurationsdatei php.ini gibt es die Einstellung upload_max_filesize, die standardmäßig auf 2 MByte gesetzt ist. Diese globale Einstellung hat höchste Priorität, d.h. man kann sie nicht mit einer höheren Einstellung von MAX_FILE_SIZE überbieten.

Seit Version PHP 4.0.2 gibt es die Funktionen is_uploaded_file() und move_uploaded_file(), die das Kopieren von übertragenen Dateien erleichtern und etwas sicherer machen. Das obige Beispiel würde damit so aussehen:

	if (move_uploaded_file($geschicktedatei, "/tmp/".$geschicktedatei_name)) {
		echo "Übertragung gelungen\n";
	} else {
		echo "Es wude keine Datei übertragen\n";
	}
Um lediglich zu testen, ob eine Datei übertragen wurde, gibt man an:
	if (is_uploaded_file($geschicktedatei) {
		echo "Datei wurde übertragen\n";
	} else {
		echo "Es wurde keine Datei übertragen\n";
	}


30) Passwort-Beschränkung von Seiten

PHP bietet eine einfache Möglichkeit, den Zugang zu einer HTML-Datei mit einer Benutzerkennung und einem Passwort zu versehen, die durch ein kleines Netscape- bzw Internet-Explorer-Dialogfenster abgefragt werden. Dies geschieht über den http-Header.

Nachdem der Betrachter Login und Passwort eingegeben hat, sind drei PHP-Variablen gesetzt:

Mit PHP muß nun entschieden werden, ob der Betrachter die richtigen Angaben gemacht hat. Nehmen wir an, der login-Name soll heinz und das Passwort qwertz sein.

Im Header (d.h. vor allen HTML-Kommandos) könnte dann folgender PHP-Code gesendet werden:

<?
	if (!isset($PHP_AUTH_USER) ||
	    ($PHP_AUTH_USER!="heinz") ||
	    ($PHP_AUTH_PW!="qwertz")
		) {
		Header("WWW-Authenticate: Basic realm=\"Anmeldung am Server\"");
		Header("HTTP/1.0 401 Unauthorized");
		echo "Anmeldung nicht erfolgreich\n";
		exit;
	} else {
		echo "Anmeldung erfolgreich\n";
	}
?>
Dieses Beispiel ist sehr einfach gehalten. Besser wäre es, die möglichen Benutzernamen und die Passwörter in einer Datenbank zu speichern und beim Auruf der Seite zu überprüfen.

Diese Art der Anmeldung birgt einige Nachteile mit sich. Unter anderem ist nich genau festgelgt, wann der Zugriff endet (Beim Beenden des Browsers, oder beim Beenden des Fensters...). Ausserdem ist diese Art der Zugangsbeschränkung nicht möglich, wenn PHP im CGI-Modus läuft.

Eine weitere Möglichkeit, den Zugriff zu beschränken, bietet unter anderem der apache-Server mit .htaccess-Dateien.


<- Vorlesung 8 Übungen Vorlesung 10 ->

Alfred.Wassermann@uni-bayreuth.de