Filbehandling (Kapittel 8)
Mål Forstå hvordan filbehandling fungerer i PHP inkludert Lagre og hente ut informasjon på filer Gjøre filoperasjoner Laste opp filer via skjemaer Forstå sikkerhetsrisikoen ved filopplasting
Hva er filbehandling? Viktig del av webprogrammering Vanlige bruksområder Lagring av data Konfigurasjon Caching
Filbehandling i PHP omfatter Opprette nye filer Endre/lese innholdet i filer Finne filer Motta filer gjennom skjema Kopiere, flytte og slette filer og kataloger Endring av rettigheter Gjennkjenne filtyper
Normal behandlingsprosess Åpne filen Operere mot filen Lukke filen <?php $fp = fopen('fil.txt', 'r'); $linje = fread($fp, 4096); fclose($fp); ?>
Hva med feilhåndtering? <?php if($fp = fopen('fil.txt', 'r')) { $linje = fread($fp, 4096); fclose($fp); } else { echo “Klarte ikke åpne fila”; } // alternativt $fp = fopen('fil.txt', 'r') or die(“Klarte ikke åpne fila”); ?>
Viktige begreper Filreferansen Modus Filnavnet Filpekeren Vet hvilken fil den oppererer på Modus Filer åpnes i et modus basert på hvilke operasjoner du skal utføre Filnavnet Relative eller absolutte stier eller URL'er Filpekeren Indre peker i PHP som vet hvor i filen den skal operere
Ulike modus
Mye brukte funksjoner fopen() fread() fwrite() filesize() fclose() Åpner en fil og oppretter en filreferanse fread() Leser tegn inntil den treffer på linjeskift fwrite() Skriver til fil filesize() Returnerer antall bytes en fil består av fclose() Lukker filreferansen
Skrive data til en fil <?php $fp = fopen('fil.txt', 'w'); fwrite($fp, “Hello World!”); fclose($fp); ?>
Lese data fra en fil <?php $fp = fopen('fil.txt', 'r'); $innhold = fread($fp, 4096); fclose($fp); echo $innhold; ?>
Legge til data på slutten av en fil <?php $fp = fopen('fil.txt', 'a'); fwrite($fp, “Hello World!”); fclose($fp); ?>
Sjekk om filen er lesbar <?php $fil = 'fil.txt'; if(is_readable($fil)) { $fp = fopen($fil, 'r'); echo fgets($fp); fclose($fil); } else { echo “$fil er ikke lesbar\n”; } ?>
Et par nyttige snarveier file_get_contents($fil) Returnerer hele fila som en string file_put_contents($fil, $string) Lagrer en string til en fil file($fil) Leser hele filen og returnerer en matrise med et element for hver linje i fila readfile($fil) Skriver ut innhold av fila direkte
Sortering av linjer i en tekstfil <?php // Les inn alle linjer direkte til en matrise $linjer = file(“linjer.txt”); // Sorterer matrisen i stigende rekkefølge sort($linjer); // Skriv til fil $fp = fopen(“linjer_sortert.txt”, “w”); foreach($linjer as $linje) { fwrite($fp, $linje); } fclose($fp); ?>
Behandle en fil linje for linje <?php // En mer optimal måte å behandle // linje for linje av en fil med bruk av // et buffer vi overskriver for hver løkkerunde $fp = fopen('fil.txt', 'r'); while(!feof($fp)) { $buffer = fread($fp, 4096); // Behandle buffer echo $buffer; } fclose($fp); ?>
Visningsteller <?php // Les innhold fra teller filen $filnavn = 'teller.txt'; $fil = fopen($filnavn, 'r') or die(“Kunne ikke åpne $filnavn”); $teller = (int) fread($fil, filesize($fil)); fclose($fil); $teller++; // øk teller med 1 echo “Du er besøkende nummer $teller”; // Lagre oppdatert teller $fil = fopen($filnavn, 'w'); fwrite($fil, $teller); ?>
Kopiere, slette og flytte filer Kopiere fil copy($fra, $til) Slette fil unlink($fil) Flytte fil rename($fra, $til)
Skjema for opplasting <form method="post" enctype="multipart/form-data"> <input type="file" name="bilde" size="30"/> <input type="submit" name="submit" value="Last opp"/> </form> <?php // Flytt og vis bilde if(isset($_POST['submit'])) { $tmp_name = $_FILES['bilde']['tmp_name']; $name = $_FILES['bilde']['name']; move_uploaded_file($tmp_name, $name); echo "<img src=\"$name\"/>"; } ?>
Sikkerhet ved opplasting av filer Ikke tillat hva som helst! Tillater du opplasting av filer til webområdet uten restriksjoner kan brukere laste opp egne PHP script Gi eksplisitt tillatelse til filtyper
Sikrere skjema for opplasting av bilder <form method="post" enctype="multipart/form-data"> <input type="file" name="bilde" size="30"/> <input type="submit" name="submit" value="Last opp"/> </form> <?php // Flytt og vis bilde if(isset($_POST['submit'])) { $tmp_name = $_FILES['bilde']['tmp_name']; $name = $_FILES['bilde']['name']; $ext = strtolower(substr($name, -4, strlen($name))); if($ext == '.jpg') { move_uploaded_file($tmp_name, $name); echo "<img src=\"$name\"/>"; } else { echo "Ugyldig filtype"; } ?>