Mirari
Affichage d'une page
Page "mirari.dev.upload" créée par Zephyr le 05/02/2009 à 14h48 05s :

Mirari :: Développement :: Upload de fichiers

Vous êtes sur l'une des pages d'informations pour développeurs (cliquez ici pour revenir en arrière).

Parmi les modifications visibles par rapport à la première version de Mirari, vous avez pu voir qu'une barre de progression apparaît pendant l'envoi des fichiers. Pour réaliser ça, il n'y a pas 50 façons de faire : soit c'est PHP + CGI + Ajax, c'est complexe et ça marche quand ça a le temps, soit c'est Flash et ça prend 3 lignes. Au diable donc les merveilleux standards, j'y reviendrai peut-être quand il existera une façon fiable de faire ce que Flash réalise avec autant de simplicité.

La solution, donc vous pouvez télécharger une démonstration ici, se présente donc sous la forme de 3 fichiers :

  • index.php, la page affichée à l'utilisateur
  • upload.swf, le composant flash qui s'occupe de l'upload des fichiers
  • upload.php, un script qui traite les fichiers envoyés sur le serveur

Le système proposé par Flash est relativement simple : il permet d'exécuter la requête HTTP sur une page au choix (upload.php dans notre cas) en envoyant le fichier, tout en gardant un contrôle sur le transfert en cours, ce qui permet par exemple de mettre à jour la barre d'avancement. Une fois la requête envoyée, le fichier est donc présent sur le serveur et le script upload.php est exécuté, permettant un traitement du fichier (dont les informations se trouvent dans $_FILES, comme pour n'importe quel envoi de fichier par HTTP).

Le problème, c'est que ce fichier upload.php est exécuté, mais reste invisible pour l'utilisateur. Il faut donc qu'il se passe quelque chose de visible une fois l'envoi terminé. La façon de faire la plus simple est de demander à Flash un changement de page, pour conduire l'utilisateur vers un message du style "envoi terminé". Mais cela entraine un autre problème : une fois arrivé sur cette nouvelle page, on a perdu toute information sur le fichier qui a été envoyé. La solution reste simple, il faut juste faire en sorte que Flash passe à cette page un paramètre lui indiquant le nom du fichier.

Mais ça ne suffit pas : dans le cas de Mirari, il y a d'autres paramètres que le fichier (la durée de conservation par exemple), et je ne voulais pas tout intégrer dans le .swf qui devait se restreindre à la seule chose infaisable autrement, à savoir l'upload avec barre de progression. La méthode qui m'a semblé la meilleure est donc de faire déclencher par Flash des fonctions JavaScript définies dans la page HTML. De cette façon, c'est la page qui décide quoi faire en fonction des "évènements" ainsi signalés. Dans notre cas, la fonction JavaScript appelée quand l'envoi est terminé provoque la validation d'un formulaire HTML, qui peut contenir les champs désirés (donc la durée de conservation, par exemple).

Pour résumer, voici le déroulement complet de l'envoi d'un fichier. Il y a une petite différence avec ce que j'expliquais plus haut au niveau de la méthode utilisée pour ne pas perdre les informations sur le fichier (je génère un identifiant unique en PHP depuis "index.php", qui est passé au Flash, qui lui-même le communique à la page upload.php lors de l'envoi), mais le reste est globalement identique.

  • La page "index.php" génère un identifiant unique, et affiche "upload.swf" en lui passant en paramètre
  • Le composant "upload.swf" réalise l'envoi, en appelant pour certains évènements (sélection d'un fichier, début de l'envoi, fin de l'envoi) des fonctions JavaScript définies dans "index.php".
  • Une fois le fichier envoyé, la page "upload.php" est appelée, et l'identifiant unique lui est fourni. Elle réalise quelques traitements sur le fichier reçu.
  • L'envoi est terminé, la fonction JavaScript appelée par "upload.swf" provoque la validation du formulaire de la page "index.php". Ce formulaire contient entre autres l'identifiant unique généré au début.
  • On arrive sur la page de destination (qui ici est à nouveau "index.php"), qui retrouve grâce à l'identifiant unique le fichier déjà traité par "upload.php".

Pour essayer la démo, il suffit d'envoyer sur un serveur les 3 fichiers "index.php", "upload.php" et "upload.swf" ainsi que le dossier vide "data" qui recevra les fichiers envoyés. Attention aux droits en écriture sur ce dossier. Le script devrait ensuite fonctionner en appelant la page "index.php".

Dernière modification par Zephyr le 05/02/2009 à 15h13 00s

Afficher la liste des pages créées
Rechercher parmi les pages
Vous pouvez créer une page si vous possédez un compte utilisateur
© RCa 2011 :: 7 ms