Paramètres à vérifier pour l'upload de fichiers avec PHP

Pour uploader un gros fichier avec PHP, vous devez vérifier un certain nombre de paramètres de configuration et vous assurer que votre formulaire est correct. Voici une liste que j'espère exhaustive des points à vérifier :

Fichier php.ini

  1. file_uploads doit être à On pour autoriser les envois de fichiers.
  2. max_file_uploads doit correspondre au nombre maximum de fichiers pouvant être envoyés simultanément. Cette option est disponible depuis PHP 5.2.12.
  3. upload_max_filesize doit correspondre à la taille maximale des fichiers qui peuvent être envoyés.
  4. post_max_size doit être à supérieur à upload_max_filesize puisque tous les champs du formulaire sont inclus dans cette taille.
  5. max_input_time doit correspondre au temps maximum alloué à PHP pour traiter les données en entrée.
  6. max_execution_time doit correspondre au temps maximal d'exécution du script.Doit être supérieur à max_input_time.
  7. upload_tmp_dir doit correspondre à un répertoire où PHP a les droits pour écrire.
  8. memory_limit doit être supérieur à la taille des fichiers à traiter.

Mise à jour du 31/12/2010 : max_input_time n'aurait à priori pas d'influence sur l'upload des fichiers (voir commentaires ci-dessous).

Formulaire

  1. L'attribut enctype de la balise form doit être positionné à multipart/form-data.
  2. La valeur du champ caché MAX_FILE_SIZE doit être égal à upload_max_filesize.

Serveur WEB

Il faut également vérifier qu'il n'y a pas de limitation en place au niveau de votre serveur WEB. Par exemple dans Nginx, il faut contrôler la directive client_max_body_size

Portrait de Moosh

Pour ceux qui ont la bonne

Pour ceux qui ont la bonne idée d'utiliser suhosin, il y a d'autres paramètre à examiner.

  • # suhosin.upload.max_uploads
  • # suhosin.upload.disallow_elf
  • # suhosin.upload.disallow_binary
  • # suhosin.upload.remove_binary
  • # suhosin.upload.verification_script

----
http://www.hardened-php.net/suhosin/a_feature_list.html

Portrait de Anonyme23

En passant et si je me

En passant et si je me souvient bien, max_input_time et max_execution_time n'ont pas de correlation.
L'exécution du script (donc le début du temps de calcul de durée du script) n'intervenant qu'après entière réception des donnée, un fichier volumineux pourra prendre 1 minute d'"input_time" tout en ayant un max_excution_time à 1 seconde sans que cela pose le moindre problème (si le temps de traitement des données est < 1seconde).

Portrait de Maxence

Il semblerait que tu ais

Il semblerait que tu ais raison. D'après ce rapport de bogue, max_input_time correspondrait au temps maximum alloué pour charger le flux de données en entrée dans les variables super-globales et cela arrive avant l'exécution du script. Mais comme PHP apparemment charge ses variables au moment ou le script tente de les lires, ce temps doit être réduit de façon significatif et donc n'aurais à priori pas d'impact sur l'envoi des fichiers.

Portrait de Moosh

Comment contourner

Portrait de Jérémy DERUSSÉ

Attention à l'attribut

Attention à l'attribut memory_limit (taille maximum du process PHP)qui ne dépend pas forcement de la taille du/des fichiers a traiter : Si le script ne fait que stocker le fichier uploadé dans un autre répertoire, alors memory_limit n'a aucun impact. De même si le script parcours le fichier par "block" de quelques Ko (parseur CSV par exemple).
En revanche si le script charge tout le fichier en mémoire (une image par exemple, ou un XML convertit en objet avec une méthode comme simplexml_load_file) alors memory_limit doit être supérieur a la taille du plus gros fichier plus quelques Mo pour le script