Skip to content
This repository has been archived by the owner on Jun 30, 2020. It is now read-only.

Note input file html5

Matthieu Marcillaud edited this page Jul 30, 2019 · 1 revision

Notes sur les input de type file en HTML5

Le tableau qui arrive à PHP a une structure différente en fonction du name de l'input (s'il est indiqué comme un tableau ou pas). La propriété multiple ne change pas le format du tableau reçu.

fonctionnement général de $_FILES en PHP

PHP récupère la racine de la valeur de l'attribut name envoyé, c'est à dire le conteneur du tableau.

  • si name="fichier", la racine sera fichier
  • si name="fichiers[]", la racine sera fichiers
  • si name="fichiers[images][bleues][]", la racine sera fichiers

Il crée dedans un tableau décrivant les propriétés des fichiers :

$_FILES[ $racine] = array(
    'name' => ,
    'type' => ,
    ...

Et pour chaque propriété, il va stocker l'information désirée dans le tableau qui suit la racine calculée

  • si name="fichier", $_FILES['fichier']['name'] = 'nom du fichier.ext',
  • si name="fichiers[]", $_FILES['fichiers']['name'][] = 'nom du fichier.ext',
  • si name="fichiers[images][bleues][]", $_FILES['fichiers']['name']['images']['bleues'][] = 'nom du fichier.ext',

name non tableau

Si le name n'est pas un tableau, disons avec name='fichier', et même si multiple est présent, un seul fichier sera reçu (le dernier de la sélection certainement), et on reçoit un $_FILES du genre :

'fichier' => array(
    'name' => 'xxx.png'
    'type' => 'image/png'
    'tmp_name' => 'tmp/nnn'
    'error' => 0
    'size' => 42603
)

name est un tableau

Dès que le name est un tableau, disons avec name='fichiers[]', et même si multiple est absent, on reçoit un tableau pour chaque clé, par exemple pour 1 fichier envoyé (avec ou sans multiple) :

'fichiers' => array(
    'name' => array(
        0 => 'xxx.png'
    ),
    'type' => array(
        0 => 'image/png'
    ),
    'tmp_name' => array(
        0 => 'tmp/nnn',
    ),
    'error' => array(
        0 => 0
    ),
    'size' => array(
        0 => 42603
    )
)

S'il y a plusieurs fichiers envoyés (avec multiple présent), on reçoit donc plusieurs entrées pour chaque clés :

'fichiers' => array(
    'name' => array(
        0 => 'xxx.png',
        1 => 'autre.jpg',
        2 => 'tetris.png'
    ),
    ...
)

Avec des sous tableaux, cela peut donner (avec name="fichiers[images][bleues][]")

'fichiers' => array(
    'name' => array(
        'images' => array(
            'bleues' => array(
                0 => 'xxx.png',
                1 => 'autre.jpg',
                2 => 'tetris.png'
            ),
        ),
    ),
    ...
)