Filhantering

Vi börjar med lite läsa och skriva till en befintlig fil

Det första som krävs är man har tillåtelse att sätta om rättigheterna på specifika filer på sitt konto på servern. Det har vi lyckligtvis på labbservern och görs enklast med FileZilla, högerklicka på filen och välj "File Attributes", ställ om "group" och "public" rättigheterna till att både read och write är tillåtet (dvs filen får ett värde på 666).
Detta innebär som sagt att filen måste finnas innan vi kan börja arbeta mot den.

Exemplen nedan är antagligen inte så mycket att orda om utan man förstår antagligen rätt lätt vad de gör.

kör: file_read.php
koden:
<html>
<head>
<title>file reading</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
$filename = "test.txt";
$fp = fopen($filename, "r") or die("kan inte öppna filen $filename");
while (!feof($fp)) {
$line = fgets($fp, 1024);
print "$line<br>";
}
fclose($fp);
?>
</body>
</html>

En viktig grej: vi kan bara göra en sak itaget, vill vi läsa så öppnar vi filen i läs-läge och innan vi kan göra något annat så måste vi stänga den och öppna den i nästa läge för att kunna fortsätta. T ex som exempel file_write_read_1.php som öppnar en befintlig fil och rensar och sen skriver vi, sen stönger vi filen, öppnar igen för att skriva i filen där den slutar (görs med appand-kommandot), stänger filen och slutligen så öppnar vi den för att läsa.
Innan vi kommer igång så visar vi på tre kommandon för att testa en fil.

kör: file_write_read_1.php
koden:

<html>
<head>
<title>file write read 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
$filename = "test2.txt";
if (file_exists($filename)) {
print "file, $filename, exists<br>";
}
if (is_readable($filename)) {
print "file is readable<br>";
}
if (is_writable($filename)) {
print "file is writeable<br>";
}
print "<br>";
print "<hr>Skriver till $filename<br>";
$fp = fopen($filename, "w") or die("kan inte öppna filen $filename");
fwrite($fp, "Rad 1 med write\n");
fclose($fp);

print "Nu ser innehållet på filen, $filename, ut så här:<br>";
$fp = fopen($filename, "r") or die("kan inte öppna filen $filename");
while (!feof($fp)) {
$line = fgets($fp, 1024);
print "$line<br>";
}
fclose($fp);

print "<hr>Skriver till mer info till $filename<br>";
$fp = fopen($filename, "a") or die("kan inte öppna filen $filename");
fputs($fp, "Lite mer hängs på (append)!\n");
fclose($fp);

print "Nu ser innehållet på filen, $filename, ut så här:<br>";
$fp = fopen($filename, "r") or die("kan inte öppna filen $filename");
while (!feof($fp)) {
$line = fgets($fp, 1024);
print "$line<br>";
}
fclose($fp);
?>
</body>
</html>



Det enda nya i sista exemplet är hur man plockar ut ett värde och omvandlar det till tal för att kunna utföra en beräkning.

kör t ex: file_write_read_2.php
koden:
<html>
<head>
<title>file write read 2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$filename = "test2.txt";
$fp = fopen($filename, "w") or die("kan inte öppna filen $filename");
fwrite($fp, "1\n");
for ($i=2;$i<10;$i++) {
fputs($fp, $i."\n");
}
fputs($fp, "$i");
fclose($fp);

$summa=0;
$fp = fopen($filename, "r") or die("kan inte öppna filen $filename");
while (!feof($fp)) {
$line = fgets($fp, 1024);
$summa += (int)$line;
print "+ ".(int)$line." ger summa= $summa<br>";
}
fclose($fp);
?>
</body>
</html>

Nu är det ju så att om det är flera som ska kunna skriva i en fil, så kan det ju lätt bli så att man krockar där och är inne och kladdar samtidigt i filen. Det är ju inte så bra så därför finns det finnesser som låser filen så länge en är inne i den och skriver. När den är klar så får nästa komma in, tills det är ledigt får de snällt stå och vänta.
Med följande kod kan detta åstadkommas (mer info på internet):
<?php
$fp = fopen("lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't lock the file !";
}
fclose($fp);
?>


Filhantering uppladdning av fil, borttagning av fil och skapande av fil

Först så visar jag ett exempel för uppladdning av filer, där det dessutom går att plocka bort filerna. För att kunna ha någorlunda koll så skapar vi här en separat mapp som filerna ska hamna i. Detta för att den mapp vi skapa måste ha läs, skriv och kör rättigheter. Det krävs här att man har tillåtelse att sätta om rättigheterna på sitt konto på servern. Det har vi lyckligtvis på labbservern och vi gör det enkelt med FileZilla, högerklicka på mappen och välj "File Attributes", ställ om "group" och "public" rättigheterna så att read, write och execute är tillåtet (dvs mappen får ett värde på 777).

Jag har valt att ha ett lösenordsskydd på denna tillämpning så den inte ligger öppen för hela internet att tanka upp skräp och fylla mitt konto.

kör: filemanager.php (för att kunna köra följande exempel behöver du ett lösenord som du får av din lärare, lösenordet borttaget i koden)
koden:

<html>
<head>
<title>filemanager</title>
<link href="filemanaging.css" rel="stylesheet" type="text/css">
</head>
<body>

<?php
$pw="???????";
if ( $_POST[passw] != $pw ) {
echo('<table width="600" border="0" class="kantlinje"><tr><td>');
echo('<div class="rubrik1">Välkommen att ladda upp filer!</div><br>');
echo('<div class="red">Lösenordet för att komma in i systemet får du av din lärare.</div><br><br>');
echo('<FORM ACTION="filemanager.php" name="security" method="POST">');
echo('<span class="rubrik2">Mata in lösenord:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
echo('<INPUT TYPE="password" NAME="passw">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;');
echo('<INPUT TYPE="SUBMIT" name="submit" VALUE="Logga in" class="knapp1">');
echo('<br><hr align="left" width="600"></td></tr></table>');
}
else {
if (isset($_GET[deleteFile]))
{
unlink($_GET[deleteFile]);
}
if(isset($_FILES["selectedFile"]["tmp_name"]) && $_FILES["selectedFile"]["tmp_name"] != "") //isset funktionen returnerar true om filen är definierad och ej tom sträng
{
copy($_FILES["selectedFile"]["tmp_name"], "filer/".$_FILES["selectedFile"]["name"]); //kopiera den temporära filen till test-katalogen som med sitt riktiga namn.
unlink($_FILES["selectedFile"]["tmp_name"]); //avlänkar filen
}


echo ('<table width="750" border="0"><tr><td>');
echo ('<div class="rubrik1">Ladda upp en fil till "fil"-katalogen</div> ');
echo ('<br>');
echo ('<br>');
echo ('Skriv s&ouml;kv&auml;gen till filen eller klicka p&aring; &quot;Bl&auml;ddra...&quot; ');
echo ('f&ouml;r att v&auml;lja en fil.<br>');
echo ('<form action="filemanager.php" method="post" enctype="multipart/form-data">');
echo ('<input name="selectedFile" type="file" size="40">');
echo ('<input name="submit" type="submit" value="Ladda upp" class="knapp1">');
echo ('<input name="deleteFile" type="hidden" value="">');
echo ("<input name=\"passw\" type=\"hidden\" value=\"$pw\">");
echo ('</form>');
echo ('<br>');
echo ('</td></tr></table>');
echo ('<hr width="800" align="left"><br>');
echo (' <div class="rubrik1">Lista &ouml;ver filer i "fil"-katalogen</div>');
echo (' <br>');
echo ('<table width="750" border="1" cellspacing="3" cellpadding="3">');

$dir_name = "filer";
$dir = opendir($dir_name);
$start=0;
$filelist ="<tr>";
$filelist .="<th width=\"250\"><strong>Filename</strong></th>";
$filelist .="<th width=\"100\"><strong>Type</strong></th>";
$filelist .="<th width=\"150\"><strong>Size</strong></th>";
$filelist .="<th width=\"100\"><strong>Delete file</strong></th>";
$filelist .="<th width=\"150\"><strong>Open/Get file</strong></th>";
$filelist .="</tr>";

while ($filename = readdir($dir)) {
if (( $filename != ".") && ( $filename != "..") ) {
$start=1;
$filelist .="<tr>";
$filelist .="<td>$filename</td>";
$dirandfile="filer/".$filename;
$filelist .="<td>".filetype($dirandfile)."</td>";
$filelist .="<td>".filesize($dirandfile)." byte</td>";
$filelist .="<td valign=\"middle\"><form action=\"filemanager.php?deleteFile=filer/$filename\" method=\"post\">";
$filelist .="<input name=\"passw\" type=\"hidden\" value=\"$pw\" >";
$filelist .="<input type=\"submit\" value=\"Ta bort\" class=\"knapp4\"></form></td>";
$filelist .="<td><a href=\"filer/$filename\" target=\"newwindow\">Öppna fil</a></td>";
$filelist .="</tr>";
}
}
closedir($dir);
if ($start != 0) {
echo ($filelist);
}
echo ('</table>');
}
echo ('</body>');
echo ('</html>');
?>

 



Ok, vi ska väl se hur man kan skapa en fil från scratch också. Det gör vi med touch( ); . Observera att filen skapa nu i en mapp med fullständiga rättigheter, därav behöver vi inte ställa in något speciellt på filen. Men skulle det behövas så finns funktionen chmod( ); .
T ex:
// sätt skrivrättigheter för övriga, annars kan vi inte skriva i den
chmod("/somedir/somefile", 0666); //värdet skriv oktalt (säkrast)


kör t ex: file_create_write.php
koden:

<html>
<head>
<title>file create write</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
echo "<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">";
echo 'Filnamn (med .htm eller .txt): <input type="text" name="fil" size="10"><br>';
echo 'Lite text att skriva i filen: <input type="text" name="text" size="20"><br>';
echo '<input type="submit" value="Skapa fil"><br />';
echo "</form>";

if (isset($_POST[fil])) {
//skapa filen
touch("filer/$_POST[fil]");

print "<br><hr>Skriver till $_POST[fil]<br>";
$fp = fopen("filer/$_POST[fil]", "w") or die("kan inte öppna filen $_POST[fil]");
fwrite($fp, "$_POST[text]\n");
fclose($fp);
print "<br>Nu ser innehållet på filen, $_POST[fil], ut så här:<br>";
$fp = fopen("filer/$_POST[fil]", "r") or die("kan inte öppna filen $_POST[fil]");
while (!feof($fp)) {
$line = fgets($fp, 1024);
print "$line<br>";
}
fclose($fp);
}
?>
</body>
</html>

Mer info hittar du på internet.

Lycka till!