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.
- Skapa ett testprogram med följande innehåll:
<?php
phpinfo();
?>
Sätt detta program på din sajt och provkör det.
- Kontrollera följande inställningar i den lista som kommer:
- file_uploads
skall vara 1 (eller On)
- upload_max_filesize
Kontrollera storleken
- upload_tmp_dir
Kontrollera att denna katalog faktiskt finns
(brukar ibland kunna ställa till problem i Windows installationer)
- 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:
- En form som innehåller en eller flera <input type="file">
- Ett program som hanterar uploaden. Detta program skall:
- Ta emot filen. Den sätts i en temporär fil i en dedikerad
upload katalog
- Kontrollera filen. Typ av fil, storlek mm kontrolleras.
- Om filen är OK så kopieras den till den plats dit
den egentligen skall, Den temporära filen raderas automatiskt.
- 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:
- action attributet för formen skall sätas till det php
program som skall behandla datat.
- <input type="hidden" ... måste finnas
före <input type="file">
- value attributet på hidden fältet skall gärna sättas
till upload_max_filesize (se ovan) eller mindre
- 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>
Se mer i file-upload 
|