PHP uploaden van bestanden
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
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>
';
}
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.
<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.



Artikel details
Share

Soortgelijke artikels