PHP6 : Session upload progress – gerer la progression des chargements de fichiers directement avec PHP

upload-progress

A quand PHP6?! Une fonctionnalité très intéressante et déjà implémentée fait figure dans les RFC (Request for comments) de PHP6 : “session upload progress”. Vous devinez déjà de quoi ça parle! En effet cela va vous permettre de gérer les informations concernant la progression du chargement d’un fichier.
Le patch permettra de stocker les informations du chargement dans des variables de session. Ces informations pourront être utilisées par un autre script, lorsque le chargement est encore en progression, ce qui permet de donner un retour au navigateur et a l’utilisateur.

Intéressant non ? En effet, plusieurs extensions permettaient d’utiliser cette technique, mais ce n’était pas natif avec PHP. L’utilisation de l’extension de session va rendre la fonctionnalité disponible pour tout le monde.
Le patch présente quelques variables de session :

  • session.upload_progress.enabled[=1]
  • session.upload_progress.prefix[=upload_progress_]
  • session.upload_progress.name[=PHP_SESSION_UPLOAD_PROGRESS]
  • session.upload_progress.freq[=1%]
  • session.upload_progress.min_freq[=0.0]

Lorsque session.upload_progress.enabled est mise a 1, et $_POST[session.upload_progress.name] existe et n’est pas vide, les informations sur le chargement sont stoquees dans : $_SESSION[session.upload_progress.prefix . $_POST[session.upload_progress.name]]..

$_POST[session.upload_progress.name] permet de suivre plusieurs requêtes de chargement sur la même session au même temps. Rien ne sera fait lorsque cette variable n’existe pas ou qu’elle est vide, pour permettre a la variable de configuration session.upload_progress.enabled d’etre mise a 1 sans traitement inutile. Aussi, le mécanisme n’est active qu’avec les formulaires multipart/form-data.

La variable session.upload_progress.prefix est utilisée pour éliminer les conflits entre plusieurs variables de session.

Les variables session.upload_progress.freq et session.upload_progress.min_freq contrôlent la fréquence de mise a jour des données de la session. freq est donnée en octets ou en pourcentage du contenu de la variable en POST. min_freq est donnée en seconde et représente l’intervalle minimum entre deux mises a jour (ex : 0.5).

Le patch permet aussi de suivre plusieurs chargements dans une même requête. chaque fichier aura son propre tableau (comme le tableau $_FILES) avec les indexes “name”, “tmp_name”, “error” etc.

Les données stockées auront un peu l’air comme cela :

$_SESSION["upload_progress_123"] = array(
 "start_time" => 1234567890,   // Temps de debut de la requete
 "content_length" => 57343257, // taille du POST
 "bytes_processed" => 453489,  // Quantite recue et traitee en octets
 "done" => false,              // true quand le traitement soit fini, avec erreur ou non
 "files" => array(
  0 => array(
   "field_name" => "file1",       // Nom du champs

   // Les 3 elements suivants sont egaux a ceux dans $_FILES
   "name" => "foo.avi",
   "tmp_name" => "/tmp/phpxxxxxx",
   "error" => 0,
   "done" => true,                // true quand le handler POST finit le traitement
   "start_time" => 1234567890,    // temps de debut de traitement
   "bytes_processed" => 57343250, // Quantite de donnees recue et traitee pour ce fichier
  ),
  // Un autre fichier dont le chargement n'est pas fini, dans la meme requete
  1 => array(
   "field_name" => "file2",
   "name" => "bar.avi",
   "tmp_name" => NULL,
   "error" => 0,
   "done" => false,
   "start_time" => 1234567899,
   "bytes_processed" => 54554,
  ),
 )
);

Un exemple simple d’un formulaire :

" value="123" />

Il est aussi possible d’arrêter le chargement en mettant la clé “cancel_upload” a true. Par exemple : $_SESSION[“upload_progress_123”][“cancel_upload”] = true;. Ceci arrêtera le chargement du fichier en ignorant les autres variables.

En attendant la sortie de PHP6, on peut encore supporter les “hacks” du genre utiliser flash pour récupérer ce genre d’informations!

L’article RFC “Session upload progress” Original (Anglais)

Dites tous merci A Pierrick pour l’article!

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...