Guide: PHP- & MySQL-innføring: Kapittel 6

Ta imot data fra brukeren

For å lage dynamiske websider i PHP er man nødt til å ta imot og behandle data fra brukeren. Bare slik kan man tilpasse nettsiden til brukeren.

Ta imot filer

PHP kan også ta imot opplastede filer fra brukere. Da trenger du et skjema med en spesiell input-tag med type satt til file. Filene som blir lastet opp, er tilgjengelig gjennom $_FILES-variabelen, men før du får tatt den i bruk er det noen detaljer vi må igjennom.

Først og fremst må skjemaer som skal motta annet enn tekstfiler få satt attributtet enctype til multipart/form-data. Du er også nødt til å bruke POST-metoden for å laste opp filer. Som standard er PHP satt til å maksimum tillate opplasting av filer på 2 MB. Det kan være en begrensning som det kan være verdt å endre om du føler for det.

<form enctype="multipart/form-data" method="POST" action="6-15.php">
  Bilde (jpeg, jpg, png, gif): <input type="file" name="bilde" />
  <input type="submit" value="Last opp" />
</form>

Dette er skjemaet du trenger for å tillate opplasting av en fil. Dette skjemaet blir seende slik ut i en nettleser (skjemaet nedenfor virker ikke, bare så du vet det);

Bilde (jpeg, jpg, png, gif):

Gitt at dette skjemaet har filnavnet 6-14.php, kan vi lagre følgende kode som 6-15.php og ha fungerende filopplasting.

<?php
// kast brukeren tilbake om han ikke har lastet opp bilde
if (empty($_FILES['bilde']))
    
header('Location: 6-14.php');

$bilde $_FILES['bilde'];
// sjekk filendelsen på originalfilnavnet
$pathinfo pathinfo($bilde['name']);
$ext strtolower($pathinfo['extension']);
// sjekk at filendelsen er gyldig
if (in_array($ext, Array('jpeg''jpg''gif''png')))
{
    
// lag et unikt navn for bildet
    
$nyttnavn './bilder/' $pathinfo['basename'] . 
        
'-' mt_rand(010000000) . '.' $ext;
    
// flytt den opplastede filen til ny katalog
    
move_uploaded_file($bilde['tmp_name'], $nyttnavn);
    
// vis bildet
    
echo '<img src="'.$nyttnavn.'" alt="bilde" />';
}
else
    die(
'Ikke en JPEG, GIF eller PNG-fil!');
// la brukeren laste opp et bilde til
include('6-14.php');
?>

Vi passer på å sjekke at brukeren faktisk har lastet opp en fil, og at den har rett filendelse. Dette er ikke en helt trygg metode, siden brukeren bare kan gi filen han laster opp feil filendelse, og på den måten lett laste opp en .exe-fil. Dette kan du forbedre ved å sjekke MIME-typen i tillegg (den finnes i $_FILES['bilde']['type'], men også denne kan forfalskes). Den beste måten å kontrollere dette på, er å bruke et faktisk bildebibliotek til å åpne bildene og sjekke at det er et bilde.

Slik ser filopplasting ut.
Slik ser det ut når vi har lastet opp et av ingressbildene til denne artikkelserien.

Vi sørger også for å generere et noenlunde unikt filnavn (sannsynligheten for at vi skal få to like filnavn er svært liten). For å få skriptet til å fungere, må brukeren som web-serveren kjører under ha skriverettigheter til bilder-mappen, slik at man får flyttet bildet til denne katalogen.

Begrens filstørrelsen

Det finnes to måter du kan begrense filstørrelsen på. Du kan enten sjekke $_FILES['bilde']['size']-variabelen, som oppgir størrelsen på bildet i bytes. Denne kan du bruke til å avvise bildet på. Du kan også legge inn et spesielt felt i HTML-koden som du sender til brukeren, som de aller fleste nettlesere bruker til å forhindre brukeren i å laste opp for store filer. Du kan derimot ikke kun stole på denne metoden, fordi brukeren kan benytte seg av en nettleser som ikke har støtte for dette, og dermed få lastet opp en større fil. Slik ser iallfall skjemaet ut med en begrensing på 50 kB;



<form enctype="multipart/form-data" method="POST" action="6-15.php">
  <input type="hidden" name="MAX_FILE_SIZE" value="50000" />
  Bilde (jpeg, jpg, png, gif): <input type="file" name="bilde" />
  <input type="submit" value="Last opp" />
</form>

Om du vil laste opp større filer enn PHP-begrensningen på 2 MB, må du gjerne modifisere php.ini, men om du kjøper webhotell hos noen har du gjerne ikke tilgang til dette. Endringene krever at webserveren startes på nytt, så slike endringer bør du gjøre så sjelden som mulig.