Når der er tale om upload af filer, skal man huske at anvende enctype="multipart/form-data" i formen, samt input type="file"
echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';
Konfiguration
Man ønsker oftest at samle alle uploadede filer, men omvendt ønsker vi ikke en ondsindet bruger kan uploade f.eks. et php script, der slette alle vores filer.
$uploadDir = 'upload/'; //Bibliotek hvor filer uploades til - husk chmod 777
$allowedFileTypes = array('jpg','gif','png'); //Hvilke filer vil vi acceptere bliver uploadet?
Selve upload koden
Det meste bliver kommenteret i koden, men tjekket på filendelsen er tilføjet, da det er eneste måde at sikre sig mod at onde personer uploader filer man ikke ønsker. Når en fil bliver uploadet, kan man bruge $_FILES['myFile']['type'] som ved upload at et jpg billede, vil indeholde image/jpeg. Dette er dog ikke sikkert og kan udformes således, at en $_FILES['myFile']['type'] indeholder image/jpeg men selve filen rent faktisk er php-kode.
//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
//Har vi en fil?
if(is_uploaded_file($_FILES['myFile']['tmp_name']))
{
//Filendelse
$extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));
//Er filen en af de filer vi gerne vil have?
if(in_array($extension,$allowedFileTypes))
{
//Vi flytter filen fra tmp til vores UPLOADDIR
if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
{
echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully</h3>';
}
else
{
echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
}
}
else
{
echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
}
}
else
{
echo '<h3 style="color:red;">No file selected</h3>';
}
}
Den fulde kode
Gem koden som upload.php. Hvis filen gemmes under andet navn, så husk at ret i <form ... action="NAVN_PÅ_FIL.php".
<?php
$uploadDir = 'upload/'; //Bibliotek hvor filer uploades til - husk chmod 777
$allowedFileTypes = array('jpg','gif','png'); //Hvilke filer vil vi acceptere bliver uploadet?
//Er der trykket på Upload file knappen?
if(isset($_POST['myUpload']))
{
//Har vi en fil?
if(is_uploaded_file($_FILES['myFile']['tmp_name']))
{
//Filendelse
$extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));
//Er filen en af de filer vi gerne vil have?
if(in_array($extension,$allowedFileTypes))
{
//Vi flytter filen fra tmp til vores UPLOADDIR
if(move_uploaded_file($_FILES['myFile']['tmp_name'],$uploadDir . basename($_FILES['myFile']['name'])))
{
echo '<h3 style="color:green;">File ('.basename($_FILES['myFile']['name']).') uploaded succesfully</h3>';
}
else
{
echo '<h3 style="color:red;">Error - unable to upload file: '.basename($_FILES['myFile']['name']).'</h3>';
}
}
else
{
echo '<h3 style="color:red;">Wrong filetype, allowed filetypes are: ('.implode(',',$allowedFileTypes).')</h3>';
}
}
else
{
echo '<h3 style="color:red;">No file selected<h3>';
}
}
//Vores form
echo '<form action="upload.php" method="post" enctype="multipart/form-data">';
echo 'File ('.implode(',',$allowedFileTypes).'): <input type="file" name="myFile"><br />';
echo '<input type="submit" name="myUpload" value="Upload file">';
echo '</form>';
?>
ChangeLog:
07-05-2007 - (benneharli):
Havde glemt at tilføje / i <h3> så de blev ikke lukket korrekt.
07-05-2007 - (windcape):
Har rettet $_SERVER['PHP_SELF'] til upload.php.
07-05-2007 - (windcape):
Rettede måden hvorpå jeg tjekke filendelsen fra $extension = strtolower(end(explode('.',$_FILES['myFile']['name']))); til $extension = strtolower(pathinfo($_FILES['myFile']['name'],PATHINFO_EXTENSION));.
07-05-2007 - (windcape):
Forklaring på hvorfor filendelse skal bruges og man ikke kan stole på $_FILES['myFile']['type'].
21-07-2007 - (coderdk):
Har rettet $_FILES['myFile']['size']>0 til is_uploaded_file($_FILES['myFile']['tmp_name']).


