Forum und email

Bestanden uploaden naar server

Table of Contents

Met de POST methode uploaden

PHP kan 'file uploads' van elke RFC-1867 ondersteunende webbrowser (Dit zijn o.a. Netscape Navigator 3+ en Microsoft IE 3+). Dit maakt het mogelijk voor mensen om text en binary bestanden te uploaden. Met behulp van allerlei PHP-functies heb je volledige controle over wie er mag uploaden, en over het ge-uploade bestand zelf.

Note: Gerelateerde Configuratie Aantekeningen Zie ook file_uploads, upload_max_filesize, upload_tmp_dir, en de post_max_size directief in php.ini

PHP ondersteunt ook de PUT-methode voor bestand uploads. Dit wordt onder andere gebruikt door Netscape Composer en programma's die W3C's Amaya gebruiken. Zie PUT Methode Ondersteuning voor meer details.

Een 'bestands upload' scherm kan gemaakt worden met een speciaal form die er zo uit ziet:

Example#1 Bestand Upload Form

 <form enctype="multipart/form-data" action="_URL_" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="1000">
 Upload dit bestand: <input name="userfile" type="file">
 <input type="submit" value="Upload!">
 </form>
De _URL_ moet naar een PHP bestand wijzen. Het MAX_FILE_SIZE 'hidden' veld moet VOOR het 'file input' veld komen en de waarde hiervan wordt gebruikt als de maximaal toegestane grootte van het bestand dat geupload wordt. Deze waarde is in bytes.
Warning

De MAX_FILE_SIZE is een 'advies' aan de browser. Het is niet moeilijk om deze te omzeilen!! Reken er dus niet op dat het werkt... De PHP-setting voor maximum-size is daarentegen niet te omzeilen.

De variabelen voor geuploade bestanden kunnen verschillen, dit kan liggen aan de PHP-versie en de configuratie: De autoglobal $_FILES bestaat sinds PHP 4.1.0, terwijl de $HTTP_POST_FILES array al bestaat sinds PHP 4.0.0. Deze arrays bevatten alle informatie over het geuploade bestand. Het gebruik van $_FILES wordt aangeraden. Als register_globals aan staat, zullen gerelaeerde variabelen ook bestaan. register_globals staat standaard uit sinds PHP » 4.2.0.

De inhoud van de $_FILES array van het voorgaande voorbeeld is als volgt: (dit gaat uit van userfile, zoals gebruikt in het voorgaande voorbeeld)

$_FILES['userfile']['name']

De (gegeven) naam van de geuploade file.

$_FILES['userfile']['type']

De mime-type van het bestand, zoals gegeven door de browser. (Het kan voorkomen dat geen mime-type wordt gegeven, of een verkeerde wordt gegeven) The mime type of the file, if the browser provided this Een voorbeeld hiervan zou kunnen zijn "image/gif".

$_FILES['userfile']['size']

De bestandsgrootte in bytes.

$_FILES['userfile']['tmp_name']

De tijdelijke naam van het bestand, dit is ook de plaats waar het bestand tijdelijk is opgeslagen totdat het script er iets mee doet. Dit bestand wordt weggehaald zodra het script eidigt.

$_FILES['userfile']['error']

De error code ge-associeerd met deze bestands-upload. ['error'] bestaat pas sinds PHP 4.2.0

Note: In PHP versies voor 4.1.0 heette deze array nog $HTTP_POST_FILES, ook was het geen autoglobal zoals $_FILES is. PHP 3 maakt geen gebruik van $HTTP_POST_FILES, noch van $_FILES.

Als register_globals aan staat in php.ini, zijn er extra variabelen beschikbaar. Bij voorbeeld, $userfile_name zal dan gelijk zijn aan $_FILES['userfile']['name'], $userfile_type zal gelijk zijn aan $_FILES['userfile']['type'], etc. Sinds PHP 4.2.0 staat register_globals standaard uit. Het is dus niet aan te raden om te vertrouwen op het bestaan van deze variabelen.

Ge-uploade bestanden worden standaard in de standaard tijdelijke directory van de server opgeslagen, tenzij er een andere locatie is opgegeven met het upload_tmp_dir directive in php.ini. De standaard tijdelijke directory kan worden veranderd worden door de 'environment' variable (TMPDIR) te veranderen in het 'environment' waar PHP in draait. Dit kan niet in een script mbv de putenv() functie gedaan worden. Deze 'environment' variable kan ook gebruikt worden om zeker te weten dat bepaalde andere bewerkingen op alle ge-uploade bestanden werken.

Example#2 Validating file uploads

De volgende voorbeelden werken alleen met PHP versies 4.0.2 en hoger. Zie ook: is_uploaded_file() en move_uploaded_file().

<?php 
    
// Voor PHP 4.1.0 moet $HTTP_POST_FILES gebruikt worden in plaats van $_FILES.
    
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
        
copy($_FILES['userfile']['tmp_name'], "/plaats/om/heen/te/verplaatsen");
    } else {
        echo 
"Mogelijke aanval gespot: " $_FILES['userfile']['name'];
    }
    
/* ...of... */
    
move_uploaded_file($_FILES['userfile']['tmp_name'], "/plaats/om/heen/te/verplaatsen");
    
?>

Het script dat het bestand ontvangt moet zo veel mogelijk zijn best doen om het bestand goed te plaatsen. Je kan bijvoorbeeld $_FILES['userfile']['size'] gebruiken om te grote of te kleine bestanden te verwerpen. Je kan $_FILES['userfile']['type'] gebruiken om bepaalde typen bestanden niet door te laten. Sinds PHP 4.2.0, kan je ook $_FILES['userfile']['error'] gebruiken met behulp van error codes. Het maakt niet uit wat je verzint, om het bestand te behouden, moet het óf hernoemd zijn, of verplaatst

Als geen van beiden heeft plaatsgevonden, zal het bestand aan het einde van het proces, intern verwijderd worden.