Progression d'un téléversement (upload) en session
Lorsque l'option de configuration
session.upload_progress.enabled
est active, PHP sera capable de traquer la progression d'un fichier en
cours de téléversement (upload). Cette information n'est pas particulièrement utile
pour la requête de téléversement en tant que tel, mais pendant le téléversement,
une application peut envoyer une requête POST séparée (via
XHR par exemple) pour vérifier le statut de ce téléversement.
La progression du téléversement sera disponible dans la variable super-globale
$_SESSION lorsque le téléversement est en cours,
et lors d'un envoi en méthode POST d'une variable du même nom que celui
défini dans l'option de configuration INI
session.upload_progress.name.
Lorsque PHP détecte une requête POST de ce type, il remplira un tableau dans
$_SESSION, où l'index est une valeur concaténée des options
de configuration
session.upload_progress.prefix
et
session.upload_progress.name.
La clé est typiquement récupérée en lisant ces configurations INI, i.e.
]]>
Il est également possible d'annuler le téléversement courant
en définissant la clé $_SESSION[$key]["cancel_upload"] à la valeur
&true;. Lors du téléversement de plusieurs fichiers dans la même
requête, cette action n'annulera que le fichier actuellement en cours de téléchargement,
ainsi que ceux en attente de téléversement mais n'annulera pas les téléversement
terminés avec succès. Lorsqu'un téléversement est annulé en utilisant cette méthode,
la clé error du tableau $_FILES sera définie à
UPLOAD_ERR_EXTENSION.
Les options de configuration INI
session.upload_progress.freq
et
session.upload_progress.min_freq
contrôlent la fréquence de mise à jour des informations de progression de téléversement.
Avec une configuration raisonnable de ces 2 options, la surcoût en terme
de charge est quasi nul.
Exemple
Exemple de structure du tableau contenant les informations de
téléversement.
" value="123" />
]]>
Les données stockées en session ressembleront à :
1234567890, // L'heure de la requête
"content_length" => 57343257, // Longueur du contenu POST
"bytes_processed" => 453489, // Quantité d'octets reçus et traités
"done" => false, // true lorsque le gestionnaire POST a terminé, avec succès ou non
"files" => array(
0 => array(
"field_name" => "file1", // Nom du champ
// Les 3 éléments suivants sont équivalents à ceux dans $_FILES
"name" => "foo.avi",
"tmp_name" => "/tmp/phpxxxxxx",
"error" => 0,
"done" => true, // True lorsque le gestionnaire POST a terminé de gérer ce fichier
"start_time" => 1234567890, // L'heure de début de requête
"bytes_processed" => 57343250, // Quantité d'octets reçus et traités pour ce fichier
),
// Un autre fichier, en cours de téléversement, dans la même requête
1 => array(
"field_name" => "file2",
"name" => "bar.avi",
"tmp_name" => NULL,
"error" => 0,
"done" => false,
"start_time" => 1234567899,
"bytes_processed" => 54554,
),
)
);
]]>
La mise en mémoire tampon de la requête du serveur web doit être désactivée
pour la bonne marche de cette fonctionnalité, sinon PHP ne verra le fichier
qu'une fois qu'il sera totalement téléversé. Les serveurs tel que Nginx
sont connus pour mettre en mémoire tampon des grosses requêtes.
Les informations de la progression du téléversement sont écrite en session avant
qu'un script soit éxécuté. Par conséquence changer le nom de session grâce à
ini_set ou session_name donnera une
session sans les informations de progression du téléversement.