PHP uploaden van bestanden

artikel details Artikel details
In Artikels » PHP
Door BigSmoke
12-05-2008 17:04
Bron
PHP, uploaden, bestanden
share Share
Toevoegen aan eKudos Toevoegen aan NUjij Toevoegen aan Technorati Toevoegen aan Del.icio.us facebook E-mail naar een vriend Plaatsen/stemmen op MSN Reporter Blig it! Voeg toe op netjes.be
artikels Soortgelijke artikels
Volledig artikel Cronjobs
Volledig artikel Cheat Sheets
Volledig artikel Mysql Injectie
Volledig artikel Informatie opvragen zonder...
Volledig artikel PHP variabelen en operatoren


Adverteren bij Daisycon

Via PHP kan men ook scripts schrijven waarmee bestanden naar de server waarop je website staat worden geüpload. Dit is helemaal niet zo moeilijk maar het moet wel veilig gebeuren. Om een upload script te maken is een speciaal attribuut nodig in de form-tag van je formulier. enctype="multipart/form-data" geeft aan dat er bestanden mee worden verzonden. Ons formulier ziet er zo ongeveer uit.


<form method="post" action="" enctype="multipart/form-data">
    <input type="file" name="file" /><br />
    <input type="submit" name="submit" value="Upload" />
</form>


Zoals je ziet wordt via de input file tag een speciale knop+veld aangemaakt waarmee een gewenst bestand kan worden geselecteerd.
Bij het verzenden van het script worden volgende variabellen verzonden:


$_FILES['file']['name']     //De naam van het geüploade bestand
$_FILES['file']['size']     //De grootte van het geüploade bestand
$_FILES['file']['type']     //Het mime-type van het geüploade bestand
$_FILES['file']['tmp_name'] //Tijdelijke naam op server


Het formulier versturen


Allereerst moeten we controleren of het formulier werd verzonden en of het bestand file mee werd verzonden.


if(isset($_POST['submit'])){
    if(is_uploaded_file($_FILES['file']['tmp_name'])){
        //Hier zullen we het bestand controleren en vervolgens op de server plaatsen
    }
}else{
    print '
    <form method="post" action="" enctype="multipart/form-data">
        <input type="file" name="file" /><br />
        <input type="submit" name="submit" value="Upload" />
    </form>
    ';
}


Controle


Het bestand dat geüpload wordt zal aan specifieke eisen moeten voldoen. Zo kun je zelf instellen wat de maximale grootte moet zijn (in bytes) of wat de extentie zal moeten zijn. Voor ons script nemen we als maximale grootte van het bestand 150kb (dus 150x1024b = 153600b). En als toegestane mime-types image/png, image/gif en image/jpeg. Deze controle is heel belangrijk want stel dat toelaat om PHP scripts te uploaden. Dan kan men een klein script uploaden dat heel de directory van je website delete en het resultaat daarvan is niet om te lachen.


/*Toegestane mime-types*/
    $toegestaan = array('image/png', 'image/gif', 'image/jpeg');
/*Maximale grootte*/
    $max = 153600;
    
    
if(isset($_POST['submit'])){
    if(is_uploaded_file($_FILES['file']['tmp_name'])){
        $return = '';//moet leegblijven
        if($_FILES['file']['size'] > $max){
            $return = 'Het bestand is te groot ('.($_FILES['file']['size']/1024).'b)<br />';//Bestand is groter dan 150kb
        }
        if(!in_array($_FILES['file']['type'], $toegestaan)){
            $return .= 'Het bestand heeft een foute mime-type ('.$_FILES['file']['type'].')';
            //Het mime-type van het bestand werd niet in de array $toegestaan gevonden
        }
        
        if($return == ''){//geen fouten gevonden, dus upload
            /*In dit script kies ik om een random naam te geven zodat er geen dubbele afbeeldingen in de db staan*/
            $ext = strrchr($_FILES['file']['name'], ".");
            $nieuwenaam = time().$ext;
            move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$nieuwenaam);
            $return = 'Het bestand werd geüpload ('.$nieuwenaam.')';
        }
    }else{
        $return = 'Geen bestand geselecteerd';
    }
    print $return;
}else{
    print '
    <form method="post" action="" enctype="multipart/form-data">
        <input type="file" name="file" /><br />
        <input type="submit" name="submit" value="Upload" />
    </form>
    ';
}


Wat je ook moet doen om te zorgen dat het script werkt is de directory waarin je de afbeeldingen worden geüpload (hier uploads) CHMODDEN naar 777 zodat in die map bestanden mogen worden geplaatst.

De functie move_uploaded_file zal het bestand van de tijdelijke map naar de nieuwe map kopiëren en in dit script ook een nieuwe naam meegeven.
De functie is_uploaded_file gaat na of er een bestand werd geselecteerd.


1. Reactie door Diel op 09-06-08 17:06
No problem, nog veel plezier ermee!
2. Reactie door Fabian op 14-05-08 12:05
Nice, had ik net nodig ;)
Om op dit artikel te reageren dient u een account aan te maken.


webhog