Hoe kan ik meerdere bestanden uploaden met PHP?

Trefwoorden: php, multiple, file, upload, bestanden, uploaden, multipart, file
Als je een website in php maakt, kan het handig zijn om files te kunnen uploaden via je website omdat je niet altijd een FTP client tot je beschikking hebt.

Veel mensen blijken problemen te hebben bij het schrijven van een script om slechts 1 file te uploaden. Met dit (relatief korte) script, kan je oneindig veel bestanden uploaden (multiple file upload), jij kiest hoeveel invoervakken je beschikbaar wilt maken. ;-)

Het script laat toe om in eender welke browser, zonder dat je daarbij een wachtwoord en/of gebruikersnaam nodig hebt, bestanden te uploaden naar je webspace. Je kan, natuurlijk, altijd deze pagina beveiligen. Dit kan handig zijn als je ze wenst te implementeren in een admin area e.d. zodat niet iedereen die het adres kent jouw server als storage space kan gebruiken voor zijn bestanden ;-)

Hier alvast het script:

PHP
  1. <?php
  2.  
  3. #####################################################################
  4. # Deze code werd vrijgegeven onder de GPL (General Public License)  # 
  5. # Copyright (©) 2004 Martijn Wouters voor [url=http://www.multidesk.be]www.multidesk.be[/url]          #
  6. #####################################################################
  7.  
  8. // Verander de waarde naar het aantal simultane uploads dat je wil toelaten.
  9. $aantaluploads = 5;
  10.  
  11. // Verander de onderstaande string naar de map waarheen je je bestanden wil uploaden
  12. // Vergeet die map geen write-permissions te geven!!! (CHMOD 777)
  13. $map = "/opt/www/www.multidesk.be/uploads/";
  14. // Teller voor het berekenen van het aantal bestanden dat geŁpload werd
  15. $aantalbestanden = 0;
  16.  
  17. // Nagaan of er bestanden moeten geŁpload worden
  18. if (isset($_POST['submit'])) {
  19.  
  20.         // We gaan nu elke input een voor een nakijken
  21.         for ($i=0;$i<$aantaluploads;$i++) {
  22.                
  23.                 // Als de input niet leeg is...
  24.                 if (trim($_FILES['bestand']['name'][$i]) != "") {
  25.                
  26.                         // ... schrijven we het bestand weg naar de eerder opgegeven map
  27.                         move_uploaded_file($_FILES['bestand']['tmp_name'][$i], $map.$_FILES['bestand']['name'][$i]) or die("Er is een fout opgetreden tijdens het uploaden");
  28.                         // Teller voor het aantal bestanden dat geŁpload verhogen
  29.                         $aantalbestanden++;
  30.                        
  31.                 }
  32.                
  33.         }
  34.        
  35. }
  36.        
  37. // Als het aantal geŁploade bestanden groter dan 1 is...
  38. if (isset($aantalbestanden) && $aantalbestanden>1) {
  39.        
  40.         // ... laten we de bezoeker even weten dat zijn bestanden met succes weggeschreven werden
  41.         echo "Je bestanden werden met succes geŁpload.<br />";
  42.        
  43. // ... anders is er misschien slechts 1 bestand geŁpload;
  44. }elseif (isset($aantalbestanden) && $aantalbestanden==1) {
  45.        
  46.         // zoja, laten we de bezoeker weten dat zijn bestand goed werd weggeschreven
  47.         echo "Je bestand werd met succes geŁpload.<br />";
  48.        
  49. }
  50.  
  51. echo '<form method="post" enctype="multipart/form-data">';
  52.  
  53. // Eveneveel inputs genereren als eerder werd aangegeven
  54. for($i=0; $i<$aantaluploads; $i++) {
  55.  
  56.         echo '<input type="file" name="bestand[]" size="30" /><br />';
  57.        
  58. }
  59.  
  60. echo '<input type="submit" name="submit" />
  61. </form>';
  62. ?>


Vooraleer je aan de slag kan, moet je eerst een paar dingen veranderen.

Op regel 9 vind je deze code:
PHP
  1. <?php
  2. $aantaluploads = 5;
  3. ?>


Hier kan je eenvoudig aangeven hoeveel inputvelden je simultaan wil gebruiken.

Enkele regels lager vind je de volgende regel:
PHP
  1. <?php
  2. $map = "/opt/www//www.multidesk.be/uploads/";
  3. ?>

Geef hier het pad op naar de map waar je je bestanden wil opslaan. Denk er ook aan dat je je map de nodige permissies moet geven, CHMOD 777 via je FTP client zou alles moeten regelen.

Als je script niet werkt, is de kans groot dat het bestand(of de bestanden) die je probeert te uploaden te groot zijn; je kan dit misschien oplossen door aan je formulier de volgende regel toe te voegen:

PHP
  1. <?php
  2. echo '<input type="hidden" name="MAX_FILE_SIZE" value="99999999999">';
  3. ?>


Standaard laat apache je niet toe om bestanden groter dan 2 MB te uploaden.

Hou er rekening mee dat met dit script iedereen die de url weet eender welk type bestand naar je website kan uploaden. Het is dus aan te raden om een check in te bouwen als je bijvoorbeeld enkel afbeeldingen wil toelaten. Om enkel GIF's toe te laten, kan je bijvoorbeeld deze code gebruiken:

PHP
  1. <?php
  2. if ($_FILES['bestand']['type'][$i] == "image/gif"){
  3.  
  4.         // gewone upload
  5.         // Als de input niet leeg is...
  6.         if (trim($_FILES['bestand']['name'][$i]) != "") {
  7.        
  8.                 // ... schrijven we het bestand weg naar de eerder opgegeven map
  9.                 move_uploaded_file($_FILES['bestand']['tmp_name'][$i], $map.$_FILES['bestand']['name'][$i]) or die("Er is een fout opgetreden tijdens het uploaden");
  10.                 // Teller voor het aantal bestanden dat geŁpload verhogen
  11.                 $aantalbestanden++;
  12.                
  13.         }
  14.  
  15. } else {
  16.  
  17.         // Bezoeker vertellen dat het bestand van een fout type was
  18.         echo 'Het bestand dat je probeerde te plaatsen op onze server is geen GIF-afbeelding';
  19.  
  20. }
  21. ?>

Mocht je nog problemen ondervinden, aarzel dan niet om een draadje te plaatsen op onze forums ;-).Dit artikel werd geschreven door Martijn op zondag 16 mei 2004 om 19:41 en werd sindsdien 11342 keer gelezen.

  • Pagina
  • 1 van 1

Bericht geplaatst door een gast op donderdag 29 juli 2004 om 15:52:22.
hallo

je script werkt uitstekend

1 vraagje hoe pas ik het aan als ik op meerdere filetypes wil checken dus ook op jpeg en jpg?

Alvast dank voor je reactie
Bericht geplaatst door rObkE op donderdag 29 juli 2004 om 18:13:36.
rObkE heeft nog geen avatar toegevoegd
Multiviteit: 3765
Checken op de extentie met substr() of, veiliger, op het mime-type eh. :)
Bericht geplaatst door een gast op vrijdag 27 augustus 2004 om 12:33:50.

Dixit

rObkE (op 29/07/2004 18:13:36) zei:
Checken op de extentie met substr() of, veiliger, op het mime-type eh. :)
Volgens een of andere tutorial best op beide checken...
http://forum.priorweb.be/showthread.php?t=4009
Bericht geplaatst door een gast op vrijdag 16 mei 2008 om 14:47:38.

Dixit

Dixit Gast op 27/08/2004 12:33:50:

Dixit

rObkE (op 29/07/2004 18:13:36) zei:
Checken op de extentie met substr() of, veiliger, op het mime-type eh. :)
Volgens een of andere tutorial best op beide checken...
http://forum.priorweb.be/showthread.php?t=4009

Misschien een idee:
explode op . en de laatste van de array nemen :D
  • Pagina
  • 1 van 1