några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

1.17 Upload

Man kan utan alltför stora problem skapa formar som ger oss möjligheten att ladda upp filer till servern. Du bör dock först kontrollera några saker.

  1. Skapa ett testprogram med följande innehåll:
    <?php 
    phpinfo();
    ?> 
    Sätt detta program på din sajt och provkör det.

  2. Kontrollera följande inställningar i den lista som kommer:

    1. file_uploads
      skall vara 1 (eller On)

    2. upload_max_filesize
      Kontrollera storleken

    3. upload_tmp_dir
      Kontrollera att denna katalog faktiskt finns
      (brukar ibland kunna ställa till problem i Windows installationer)

    4. Kontrollera även att TEMP och TMP pekar på korrekta kataloger

    Om du arbetar på en egen lokal Windows maskin kan du ändra dessa genom att editera php.ini som finns i din windows katalog.

Grundidén

En upload består av några steg:

  1. En form som innehåller en eller flera <input type="file">

  2. Ett program som hanterar uploaden. Detta program skall:

    1. Ta emot filen. Den sätts i en temporär fil i en dedikerad upload katalog

    2. Kontrollera filen. Typ av fil, storlek mm kontrolleras.

    3. Om filen är OK så kopieras den till den plats dit den egentligen skall, Den temporära filen raderas automatiskt.

     

  3. För att vara på säkra sidan skall helst uppladdade filer sättas in i en katalog som inte har execute rättigheter, eftersom man annars kan ladda upp program eller php kod och sedan köra denna

Formen

En form som ger oss en upload ser i sin enklaste form ut så här (fetstil betecknar sådant som måste skrivas i den form det är skrivet nedan, medan kursiv betecknar sådant du kan/skall ändra):

<form enctype="multipart/form-data" action="url" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="3000">
Välj fil: <input name="minfil" type="file">
<input type="submit" value="Sänd">
</form>


Följande saker skall beaktas:

  1. action attributet för formen skall sätas till det php program som skall behandla datat.

  2. <input type="hidden" ... måste finnas före <input type="file">

  3. value attributet på hidden fältet skall gärna sättas till upload_max_filesize (se ovan) eller mindre

  4. Ordet minfil kan bytas till ett annat.

Koden

Php programmet som tar emot formdatat har tillgång till följande information som samtliga finns i $_FILES (I php versioner före 4.1.0 byter du ut $FILES till $HTTP_POST_FILES)

I nedanstående exempel betyder ordet "minfil" att det det i formen fanns följande kod: <input name="minfil" type="file">, d.v.s namnet på file boxen i formen.

$_FILES[ "minfil" ][ "name" ]
Orginalnamnet på filen som laddades upp

$_FILES[ "minfil" ][ "type" ]
Filens typ, text image/gif för bildfiler

$_FILES[ "minfil" ][ "size" ]
Filens storlek i bytes

$_FILES[ "minfil" ][ "tmp_name" ]
Det temporära namn de uppladdade filen fått

$_FILES[ "minfil" ][ "error" ]
Eventuell felkod (se file-upload.errors *)

Exempelkod

<?php
if ( isset( $_FILES[ "minfil" ] ) )
{
    
# en array med de filtyper som vi kan godkänna
    
$godkända_typer[] = "image/gif" ;    # gif
    
$godkända_typer[] = "image/pjpeg" ;    # jpeg
    
$godkända_typer[] = "image/jpeg" ;    # jpeg
    
$godkända_typer[] = "image/x-png" ;    # png

    # visar infot från $_FILES
    
echo "\$_FILES[ \"minfil\" ][ \"name\" ] " .
        
$_FILES[ "minfil" ][ "name" ] . "<br>";
        
    echo
"\$_FILES[ \"minfil\" ][ \"type\" ] " .
        
$_FILES[ "minfil" ][ "type" ] . "<br>";
        
    echo
"\$_FILES[ \"minfil\" ][ \"size\" ] " .
        
$_FILES[ "minfil" ][ "size" ] . "<br>";
        
    echo
"\$_FILES[ \"minfil\" ][ \"tmp_name\" ] " .
        
$_FILES[ "minfil" ][ "tmp_name" ] . "<br>";
        
    echo
"\$_FILES[ \"minfil\" ][ \"error\" ] " .
        
$_FILES[ "minfil" ][ "error" ] . "<br>";
    
    
# om det inte är ett fel och om filtypen är någon av de godkända
    # så flyttar vi den till samma katalog som vi finns i
    
if ( $_FILES[ "minfil" ][ "error" ] == 0 AND
        
in_array( $_FILES[ "minfil" ][ "type" ], $godkända_typer ) )
    {
        
# kontrollera om den går att flytta från sin temorära plats
        # idetta exempel laddar jag upp bilden till en katalog
        # med namnet mina_bilder
        
if ( move_uploaded_file($_FILES[ "minfil" ][ "tmp_name" ],
            
"./mina_bilder/" . $_FILES[ "minfil" ][ "name" ] ) )
        {
            
# visa om det gick
            
echo "Filen " .
                
$_FILES[ "minfil" ][ "name" ] .
                
" uppladdad till mina_bilder katalogen<br >";

            
# raderar filen direkt - vill inte skräpa ner mina kataloger
            # ni raderar självklart inte
            
unlink ( "./mina_bilder/" . $_FILES[ "minfil" ][ "name" ] );
        }
        else
        {
            
# nåt skumt håller på att ske?
            
echo "Möjlig hackerattack?";
        }
    }
    else
    {
        echo
"Du får bara ladda upp bilder";
    }
}
?>
<form enctype="multipart/form-data"
    action="up.php"
    method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input name="minfil"type="file"><br>
<input type="submit" value="Sänd filen">
</form>
<p>Prova gärna med olika typer av filer, samt med tomt i fileboxen</p>
Listning 1.17.1 - samples/up.php
[Visa i separat fönster]

Se mer i file-upload *

   Börja härUpload