Datei Up- und Download
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:
$fp soll ein Dateihandler sein, der mit fopen() erzeugt wurde.
Befehl |
Beispiel |
Funktion |
---|---|---|
fopen |
$fp = fopen($path, $modus); |
öffnet die Datei $path in einem bestimmten Modus. Modi im ASCII-Format: r = nur 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";
}
?>
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:
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:
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
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
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);
$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(); ?>
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']; ?>