Registreren

    Informatie

    Het is heel gemakkelijk om lid te worden. Door je gegevens op te geven op de registratie pagina ontvang je automatisch een email met je inlog gegevens.

  • Registreer je hier

Aanmelden

    Informatie

    Omdat je niet aangemeld bent is het gebruikerspaneel niet beschikbaar. Vul hiernaast je gegevens in om gebruik te maken van het gebruikerspaneel.

Aanmeldformulier


Bestanden uploaden

PHP is een scripttaal, die bedoeld is om op webservers dynamische webpagina's te creëren. PHP is in 1994 ontworpen door Rasmus Lerdorf, een senior software engineer bij IBM. Destijds was de taal duidelijk geïnspireerd door Perl.

Aanvankelijk stonden de letters PHP voor Personal Home Page (de volledige naam was Personal Home Page/Forms Interpreter, PHP/FI). Sinds PHP 3.0 is de betekenis een recursief acroniem geworden: PHP: Hypertext Preprocessor.

Bestanden uploaden

Berichtdoor Theo » 03 Sep 2008 23:20

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
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 enctype. Hierin geven we aan dat we een bestand willen uploaden.

Ten tweede zien we een verborgen veld genaamd MAX_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
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.
Hier kunnen we natuurlijk gebruik van maken tijdens het controleren van het bestand. We zetten de errors in een array waarna we deze kunnen weergeven, mits er een error is.

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 move_uploaded_file functie. Zorg er voor dat de map wel geCHMOD is naar 777.

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 <form>-tag.

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()

Terug naar PHP



Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast


cron