Bestanden uploaden
1 bericht
• Pagina 1 van 1
Bestanden uploaden
Inleiding
In dit artikel ga ik jullie proberen uit te leggen hoe je bestanden, met behulp van PHP, naar je server kunt uploaden via een formulier.
Het formulier
Om bestanden te kunnen uploaden hebben we een formulier nodig. Daarvoor gebruiken we de volgende code:
HTML
Er zijn twee dingen die opvallen. Ten eerste deenctype . Hierin geven we aan dat we een bestand willen uploaden.
Ten tweede zien we een verborgen veld genaamdMAX_FILE_SIZE . Hierin geef je de maximale grootte die het bestand mag hebben in bytes. Zorg ervoor dat het verborgen veld altijd voor het file veld komt!
En dan?
Nadat je het bestand geupload heb wil je er wat mee kunnen. De gegevens van het bestand worden, vanaf PHP 4.1.0, opgeslagen in de array$_FILES . Wanneer je gebruikt maakt van oudere versies kun je gebruik maken van $HTTP_POST_FILES .
Om te kijken wat er in die array staat gaan we hem printen.
PHP
Dit heeft voor het bestand P1010084.JPG de volgende output:
Toelichting array:
Bestand controleren
Voordat we het bestand op onze server willen hebben gaan we eerst controleren of het wel aan onze eisen voldoet.
Als eerste gaan we kijken of het geen hack poging is. Dit kunnen we vrij simpel controleren:
PHP
Vervolgens gaan we kijken of het type bestand wel geüpload mag worden. We maken een array met toegestane mime-types. Vervolgens controleren we of het type toegestaan is.
PHP
Als laatste willen we nog kijken of de grootte van het bestand wel juist is.
PHP
Error gebruiken
We zagen al dat in de array een error bericht zat. Deze kan zes waarden bevatten, namelijk:
PHP
Het bestand verplaatsen
Nadat we de nodige dingen gecontroleerd hebben kunnen we, mits het bestand aan de eisen voldoet, in de juiste map plaatsen. Om dit te realiseren maken we gebruiken van demove_uploaded_file functie. Zorg er voor dat de map wel geCHMOD is naar 777.
PHP
Samenvatting
Om het geheel wat meer duidelijkheid te geven zal ik nu een code plaatsen die je kunt gebruiken om bestanden te uploaden. Het zal gebruik maken van alle snippets die in dit artikel staan.
PHP
Velden uitschakelen
Als kleine toevoeging heb ik nog een leuke snippet. Met dit stukje script kun je de velden van het formulier uitschakelen zodra het formulier verzonden wordt. Het enige wat je er voor moet doen is het volgende stukje toevoegen aan de<form> -tag.
JAVASCRIPT
Zorg ervoor dat je, indien je het met PHP parsed, de aanhalingstekens escaped.
In dit artikel ga ik jullie proberen uit te leggen hoe je bestanden, met behulp van PHP, naar je server kunt uploaden via een formulier.
Het formulier
Om bestanden te kunnen uploaden hebben we een formulier nodig. Daarvoor gebruiken we de volgende code:
HTML
- Code: Alles selecteren
<form name="uploadform" enctype="multipart/form-data" name="uploadform" action="__URL__" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1024" />
<input type="file" name="uploadbestand" />
<input type="submit" name='submit' value="Uploaden" />
</form>
Er zijn twee dingen die opvallen. Ten eerste de
Ten tweede zien we een verborgen veld genaamd
En dan?
Nadat je het bestand geupload heb wil je er wat mee kunnen. De gegevens van het bestand worden, vanaf PHP 4.1.0, opgeslagen in de array
Om te kijken wat er in die array staat gaan we hem printen.
PHP
- Code: Alles selecteren
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
echo '<pre>';
print_r($_FILES); // Of $HTTP_POST_FILES
echo '</pre>';
}
else
{
... formulier weergeven ...
}
?>
Dit heeft voor het bestand P1010084.JPG de volgende output:
- Code: Alles selecteren
Array
(
[uploadbestand] => Array
(
[name] => P1010084.JPG
[type] => image/jpeg
[tmp_name] => /tmp/phpIcfvoX
[error] => 0
[size] => 596370
)
)
Toelichting array:
- name - Naam van het geuploade bestand.
- type - MIME type van het geuploade bestand.
- tmp_name - Tijdelijke pad en naam van het bestand.
- error - Error bericht (wordt later toegelicht).
- size - grootte van het geuploade bestand (in bytes).
Bestand controleren
Voordat we het bestand op onze server willen hebben gaan we eerst controleren of het wel aan onze eisen voldoet.
Als eerste gaan we kijken of het geen hack poging is. Dit kunnen we vrij simpel controleren:
PHP
- Code: Alles selecteren
<?php
if(!is_uploaded_file($_FILES['uploadbestand']['tmp_name']))
die("Hack poging <em>".$_FILES['uploadbestand']['name']."</em>");
?>
Vervolgens gaan we kijken of het type bestand wel geüpload mag worden. We maken een array met toegestane mime-types. Vervolgens controleren we of het type toegestaan is.
PHP
- Code: Alles selecteren
<?php
$toegestane_mimetypes = array("image/jpeg","image/jpg","image/gif","image/png");
$mimetype = strtolower($_FILES['uploadbestand']['type']);
if(!in_array($mimetype,$toegestane_mimetypes))
die("U gebruikt een ongeldig bestandstype!");
?>
Als laatste willen we nog kijken of de grootte van het bestand wel juist is.
PHP
- Code: Alles selecteren
<?php
$toegestane_grootte = 250*1024; // Grootte in bytes > 250*1024 = 250kb
if($_FILES['uploadbestand']['size'] > $toegestane_grootte)
die("Het bestand is te groot");
?>
Error gebruiken
We zagen al dat in de array een error bericht zat. Deze kan zes waarden bevatten, namelijk:
- 0 - Geen errors.
- 1 - De grootte van het bestand overschrijdt de upload_max_filesize in php.ini.
- 2 - De grootte van het bestand overschrijdt de MAX_FILE_SIZE die opgegeven is in het HTML formulier.
- 3 - Het bestand is slecht gedeeltelijk geupload.
- 4 - Geen bestand geupload.
- 6 - Kan de tijdelijke map niet vinden.
PHP
- Code: Alles selecteren
<?php
$errors = array(
0=>"Bestand succesvol geupload.",
1=>"De grootte van het bestand overschrijdt de upload_max_filesize (".ini_get("upload_max_filesize").") in php.ini.",
2=>"De grootte van het bestand overschrijdt de MAX_FILE_SIZE die opgegeven is in het HTML formulier",
3=>"Het bestand is slecht gedeeltelijk geupload.",
4=>"Geen bestand geupload.",
6=>"Kan de tijdelijke map niet vinden."
);
if($_FILES['uploadbestand']['error'] != 0)
die("<strong>ERROR:</strong><br />".$errors[$_FILES['uploadbestand']['error']]);
?>
Het bestand verplaatsen
Nadat we de nodige dingen gecontroleerd hebben kunnen we, mits het bestand aan de eisen voldoet, in de juiste map plaatsen. Om dit te realiseren maken we gebruiken van de
PHP
- Code: Alles selecteren
<?php
$uploadmap = '/temp/';
$bestand_nieuw = $uploadmap . basename($_FILES['uploadbestand']['name']);
if (move_uploaded_file($_FILES['uploadbestand']['tmp_name'], $bestand_nieuw))
echo "Bestand succesvol geupload.";
else
echo "Bestand niet geupload.";
?>
Samenvatting
Om het geheel wat meer duidelijkheid te geven zal ik nu een code plaatsen die je kunt gebruiken om bestanden te uploaden. Het zal gebruik maken van alle snippets die in dit artikel staan.
PHP
- Code: Alles selecteren
<?php
// Maximale bestandsgrootte in bytes
$toegestane_grootte = 1024*1024;
// Toegestane extensies
$toegestane_mimetypes = array("image/jpeg","image/jpg","image/gif","image/png");
// Map waar het bestand geplaatst moet worden.
$uploadmap = 'temp/';
// Error berichten
$errors = array(
0=>"Bestand succesvol geupload.",
1=>"De grootte van het bestand overschrijdt de upload_max_filesize (".ini_get("upload_max_filesize").") in php.ini.",
2=>"De grootte van het bestand overschrijdt de MAX_FILE_SIZE (".$toegestane_grootte." bytes) die opgegeven is in het HTML formulier",
3=>"Het bestand is slecht gedeeltelijk geupload.",
4=>"Geen bestand geupload.",
6=>"Kan de tijdelijke map niet vinden."
);
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Mime-type bepalen
$mimetype = strtolower($_FILES['uploadbestand']['type']);
// Controleren of er geen hack poging plaats vind
if(!is_uploaded_file($_FILES['uploadbestand']['tmp_name']))
die("Mogelijke hack poging <em>".$_FILES['uploadbestand']['name']."</em>");
// Op errors controleren
elseif($_FILES['uploadbestand']['error'] != 0)
die("<strong>Error:</strong><br />".$errors[$_FILES['uploadbestand']['error']]);
// Bestandsgrootte controleren
elseif($_FILES['uploadbestand']['size'] > $toegestane_grootte)
die("Het bestand is te groot");
// Extensie controleren
elseif(!in_array($mimetype,$toegestane_mimetypes))
die("U gebruikt een ongeldig bestandstype!");
// Alles in orde, bestand verplaatsen
else
{
$bestand_nieuw = $uploadmap . basename($_FILES['uploadbestand']['name']);
// Verplaatsen en weergeven of dat gelukt is of niet
if (move_uploaded_file($_FILES['uploadbestand']['tmp_name'], $bestand_nieuw))
echo "Bestand succesvol geupload.";
else
echo "Bestand niet geupload.";
}
}
else
{
// Het formulier
echo "<form name='uploadform' enctype='multipart/form-data' action='".$_SERVER['PHP_SELF']."' method='post'>
<input type='hidden' name='MAX_FILE_SIZE' value='".$toegestane_grootte."' />
<input type='file' name='uploadbestand' /><br />
<input type='submit' name='submit' value='Uploaden' />
</form>";
}
?>
Velden uitschakelen
Als kleine toevoeging heb ik nog een leuke snippet. Met dit stukje script kun je de velden van het formulier uitschakelen zodra het formulier verzonden wordt. Het enige wat je er voor moet doen is het volgende stukje toevoegen aan de
JAVASCRIPT
- Code: Alles selecteren
onsubmit="document.uploadform.uploadbestand.disabled=true; document.uploadform.submit.disabled=true;"
Zorg ervoor dat je, indien je het met PHP parsed, de aanhalingstekens escaped.
- Theo
- Oprichter
- Berichten: 1795
- Geregistreerd: 11 Jun 2005 17:43
- Woonplaats: in_array()
1 bericht
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast