Dynamische Webseiten mit PHP

Datei Up- und Download

Allgemeines

Die Dateifunktionen ermöglichen einen Zugriff auf das Dateisystem des Serverbetriebssystems. Daher kann der Betrieb von PHP ein Sicherheitsrisiko sein. Möglichkeiten auf das Dateisystem des Clients zuzugreifen gibt es jedoch keine (serverseitige Skriptsprache!).

Es liße sich sogar - wenn auch umständlich - eine Datenbank ersetzen, indem man die Daten in eine Datei schreibt und bei Bedarf diese Datei läd und ausliest.

Anwendungsfelder:

  • Logdateien schreiben
  • Formulardaten ablegen
  • Textbausteine, die dynamisch in Webseiten eingebaut werden sollen speichern
  • Zählerstand speichern
  • ...


Dateien lesen und schreiben

$fp soll ein Dateihandler sein, der mit fopen() erzeugt wurde.

Lesen und Schreiben von Dateien

Befehl

Beispiel

Funktion

fopen

$fp = fopen($path, $modus);

öffnet die Datei $path in einem bestimmten Modus.

Modi im ASCII-Format:

r = nur lesen
r+ = lesen und schreiben
w = nur schreiben
w+ = lesen, schreiben, löschen und ggf. Datei anlegen
a = schreiben, Dateizeiger am Ende und ggf. Datei anlegen
a+ = wie a mit lesen

Modi Binär: wie oben mit vorangestelltem b (br+...)

fclose

fclose($fp);

Schliesst die Datei wieder

fgetc

fgetc($fp)

liest ein einzelnes Zeichen ein. Ist das Ende der Datei erreicht wird FALSE zurückgegeben

feof

feof($fp)

Überprüft Dateiende, wenn ja TRUE

fgets

fgets($fp, $maxlength)

Liest eine Zeile aus der Datei (\n)

fgetss

fgetss($fp, $maxlength)

Liest eine Zeile aus der Datei und entfernt HTML Tags

fgetcsv

$arr = fgetcsv($fp, $len, $delim)

Liest eine Zeile aus der Datei, zerlegt sie anhand von $delim und gibt das Ergebnis als Array aus

fputs

Schreibt an die Stelle des Dateizeigers

file

file(,filename")

Liest eine ganze Datei in ein Array ein

fread

fread($fp, $length)

Liest $length Byte aus einer Datei ein

fseek

fseek($fp, $offset)

Setzt den Dateizeiger $offset vor oder zurück

ftell

ftell($ftell)

Aktuelle Position des Dateizeigers

fwrite

fwrite($fp, $str)

Schreibt $str in die Datei

readfile

$size = readfile(,filename")

Liest eine Datei ein und gibt sie direkt im Browser aus. Zurück kommt die Anzahl der Bytes oder FALSE.

rename

rename(,alt","neu")

Benennt eine Datei um

rewind

rewind($fp)

Setzt den Dateizeiger auf den Anfang

unlink

unlink(,filename")

Löscht eine Datei

copy

copy(,filename", "$path")

Kopiert eine Datei an die Stelle $path (der auch einen neuen Namen enthalten kann) True/False

(Evtl. Warnungen mit @copy unterdrücken)

Beispiel Öffnen und zeilenweises Auslesen einer Datei:

<?
$path = "/usr/local/apache/htdocs/daten.txt";
$modus = "w";

if ($fp = fopen($path, $modus)) {
while ($str = fgets($fp, 100)) {
echo $str."<br>";
}
if (fclose($fp))
echo ,Datei geschlossen";
}
else {
echo ,Datei konnte nicht geöffnet werden";
}
?>


Dateiverzeichnis und Zugriffsrechte

Dateien
Funktion Beispiel Beschreibung

basename

basename($path)

Gibt den Dateinamen eines Pfades zurück

diskfreespace

diskfreespace($dir)

Freier Speicherplatz in einem Verzeichnis

file_exists

file_exists(,filename")

Prüft ob Datei vorhanden

fileatime

fileatime(,filename")

Datum des letzten Zugriffs

filectime

filectime(,filename")

Datum der Erstellung

filemtime

filemtime(,filename")

Datum der letzten Änderung

fileowner

fileowner(,filename")

Besitzer der Datei

fileperms

fileperms(,filename")

Zugriffstechte der Datei oder des Verzeichnis

filesize

filesize(,filename")

Größe der Datei

filetype

filetype(,filename")

Dateityp

is_dir

is_dir(,filename")

Prüft ob es ein Verzeichnis ist

is_executable

is_executable(,filename")

Prüft ob ausführbar

is_file

is_file(,filename")

is_readable

is_readable(,filename")

is_writeable

is_writeable(,filename")

stat

$arr = stat()

Informationen über eine Datei im Array

Zugriffsrechte einer Datei ermitteln:

$erg = fileperms($path);
echo decoct($erg);

Die Zugriffsrechte werden als Integer übermittelt, daher muss aus ihnen erst mit decoct() eine Oktalzahl gemacht werden. Das Ergebnis könnte dann zum Beispiel 100644 sein. Die ,100" bedeutet dass es sich um eine Datei handelt, die ,644" erschließt sich aus der nachfolgenden Tabelle:

Zugriffsrechte
Besitzer Gruppe Andere

read

write

delete

read

write

delete

read

write

delete

400

200

100

40

20

10

4

2

1

700

70

7

(rwx/rwx/rwx = 777)

stat() gibt Informationen über eine Datei im Array aus:

<?
$path = ,/usr/local/apache/htdocs/daten.bin";
$arr = stat($path);
foreach ($arr as $key=>$elem) {
echo ,$key=>$elem<br>";
}
?>

Array ist folgendermassen aufgebaut:

stat()-Array
Feld

Inhalt

0

Gerät

1

inode

2

inode protection mode

3

Anzahl der Links

4

Besitzer der Datei

5

Benutzergruppe des Besitzers

6

Geräte-Typ (nur bei inode Geräten)

7

Größe in Byte

8

Letzter Zugriff

9

Letzte Änderung

10

Erstellungsdatum

11

Cluster Größe für das Dateisystem I/O

12

Anzahl der zugeordneten Cluster

Funktionen für das Verzeichnissystem

Verzeichnisse
Funktion Beispiel Beschreibung

chdir

chdir($dir)

Wechselt das Verzeichnis

closedir

closedir($dir)

Schließt ein geöffnetes Verzeichnis

dir

dir($dir)

Öffnet ein Verzeichnis und erstellt eine Klasse

dirname

dirname($path)

Gibt das Verzeichnis zurück

mkdir

mkdir($path, $mode)

Erstellt ein Verzeichnis

opendir

opendir($dir)

Öffnet ein Verzeichnis

readdir

readdir($dir)

Liest einen Eintrag aus einem Verzeichnis

rewinddir

rewinddir($dir)

Springt zum ersten Verzeichniseintrag

mrdir

mrdir($dir)

Löscht ein Verzeichnis

chgrp

chgrp($filename,$group)

Ändert die Benutzergruppe einer Datei

chmod

chmode($filename,$mode)

Ändert die Zugriffsrechte einer Datei

chown

chgrp($filename,$user)

Ändert den Besitzer einer Datei

touch

chgrp($filename,$time)

Setzt das Datum der letzten Veränderung

umask

umask($mask)

Ändert die aktuelle, als Integer angegebene Rechtemaske einer Datei.

$obj = dir($path) öffnet ein Verzeichnis und erstellt eine Klasse zur weiteren Verwendung.

Beispiel: Ausgeben des freien Speicherplatzes und des Inhalts von htdocs

<?
$path = ,/usr/local/apache/htdocs/";
$folder = dir($path);
$free = diskfreespace($path);
echo $free." Bytes frei";
while ($datei = $folder->read()) {
echo ,\n$datei<br>";
}
$folder->close();
?>

Mit -> wird eine Methode der Klasse $folder aufgerufen. Folgende Methoden stehen zur Verfügung:

handle() = erzeugt ein Handler
path() = Gibt den Pfad des Verzeichnisses zurück
read() = liest den nächsten Eintrag im Verzeichnis oder FALSE
rewind() = setzt den Dateizeiger zurück
close() = schliesst das Verzeichnis


Dateiupload

Formular für Dateiauswahl

<form name="form1" method="post" enctype="multipart/form-data" target="_self">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type="file" size=40 name="pfad">
<input type="submit" name="submit" value="hochladen">
</form>

Das Formular legt eine Dateigrößenbeschränkung fest (2MB). Größere Dateien werden nach dem Upload (!) abgelehnt. Den Uploadvorgang selbst kann man nicht unterbinden, da nicht der Browser die Dateigröße testet, sondern erst der Server.

Der input Typ ,file" bietet die Auswahlbox.

Hochladen der Datei

Die hochgeladenen Dateien werden in einem temporären Verzeichnis des Servers gespeichert. Von dort aus werden sie dann an die Stelle kopiert, wo sie später sein sollen.

copy($tempname,"upload_folder/$filename");

Informationen über das hochgeladene File bekommt man durch das Array $_FILES

Beispiel (pfad ist der name des Dateiauswahlbuttons im HTML-Dokument):

$pfad = $_POST['pfad'];

$datei_name = $_FILES['pfad']['name'];
$temp_name = $_FILES['pfad']['tmp_name'];
$max_file_size = $_POST['MAX_FILE_SIZE'];
$groesse = round($_FILES['pfad']['size']/10)/100;
$typ = $_FILES['pfad']['type'];

# Ordner anlegen
$isDir = @mkdir($ServerHome.$vvzid,777);

# Ziel definieren
$destination = $ServerHome.$vvzid."/".$datei_name_neu;

# Datei verschieben
$move = move_uploaded_file ( $temp_name, $destination);


Ein kleiner Dateibrowser

$path = $_GET['path'];
if (!isset($path))
    $path = "/Users/username/Sites";	
	
echo "Ausgabe von: ".$path."<br /><br />";

$backpath = substr($path,0,strrpos($path,'/'));
echo "<a href='Dateibrowser.php?path=".$backpath."'>zurück</a><br /><br />";
	
$folder = dir($path);		
											
while ($datei = $folder->read()) {		
										
	if (substr($datei,0,1) == ".") {	
		continue;						
		}								
			
	if (is_dir($path."/".$datei)) {						
		echo "<a href="Dateibrowser2.php?path=".$path."/".$datei."">"; 
echo "<img src="fld.gif" border="0" /> ".$datei."</a><br />"; } else { echo "</pre> <img src="doc.gif" border="0" /> <pre> ".$datei."<br />"; } } $folder->close(); ?>

Upload von Bildern in eine Datenbank

Speichern der Datei in der Datenbank

 
<html>

<?php
##### Bild speichern
include("config.php"); 

if (isset($_FILES['bild'])) {

    $name = $_POST['name'];
    $tempname = $_FILES['bild']['tmp_name'];
    $type = $_FILES['bild']['type'];
    
    

    $hndFile = fopen($tempname, 'r');

    $data = addslashes(fread($hndFile, filesize($tempname)));

    $sql = "INSERT INTO bilder (bilddaten, name, typ) VALUES ('$data','$name','$type')";
    mysql_query($sql);
}
?>

<body>
    <br />
    Neues Bild:<br />
    <form action="" method="post" enctype="multipart/form-data">
     <table align="center">
        <tr><td>neues Bild hochladen:</td><td><input type="file" name="bild"></td></tr>
	   <tr><td>Bildtitel:</td><td><input type="text" name="name" size="20"></td></tr>
        <tr><td><input type="submit" value="hochladen"></td><td> </td></tr>
     </table>        
 </form>
    
</body>
</html>
	

Bild aus der Datenbank lesen

 
<html>

<body>
<? 
         include("config.php");
    
         $sql = "SELECT * FROM bilder";
         $result = mysql_query($sql);
         
         echo '<table border="1" align="center"><tr align="center">';
         $zaehler = 0;
         
         while ($myrow = mysql_fetch_array($result)) {
             $zaehler++;
             
             echo '<td><img src="bild.php?id='.$myrow['id'].'" width="200" 				height="100"></td>';
             
             if ($zaehler > 3) {
                 $zaehler = 0;
                 echo '</tr><tr>';
                 }
             
             }
         echo '</tr></table>';
         
         ?>

    
</body>
</html>
	

Bild erzeugen

 
<?php
include("config.php");

$id = $_GET['id'];
$sql = "SELECT * FROM bilder WHERE id=$id";
$result = mysql_query($sql);
$myrow = mysql_fetch_array($result);

header("Content-type: {$myrow['typ']}"); 
echo $myrow['bilddaten'];

?>