Upload asynchrone de fichier sur votre site Web en Java

 Article modifié dernièrement le 3 Juin 2011 @ 11 h 10 min

L’upload de fichier depuis un site Web est particulièrement délicate, car il faut que le traitement du fichier soit fait discrètement en arrière plan pour ne pas que l’utilisateur soit bloqué et surtout il faut dans la plupart du temps que l’on sache que le fichier est fini de traité afin de proposer la suite à l’internaute.

file_upload

En parcourant le Web j’ai trouvé beaucoup de scripts permettant de faire tout ça mais en PHP, dans mon cas c’est Java qui m’intéresse et j’ai trouvé souvent les moyens proposés très complexes et pas franchement convaincant. Je vais donc vous présenter la solution que j’ai adapté et qui me semble relativement simple à mettre en place.

Néanmoins il faut en comprendre les mécanismes que je vais vous dévoiler :

  1. Mise en place du formulaire permettant à l’utilisateur de pouvoir choisir un fichier depuis son ordinateur (partie HTML)
  2. Action qui va récupérer le fichier donné (client -> serveur) afin d’en lire le contenu (partie Java)
  3. Fin du traitement donnant la possibilité d’alerter l’utilisateur que son fichier a correctement été traité (partie JavaScript)

HTML

  • Voici un exemple de formulaire qui permet à l’utilisateur de choisir et soumettre un fichier :
  • Dans ce formulaire, nous utilisons une Servlet comme action (/upload) lorsque l’utilisateur clique sur le bouton « Ajouter ». Cette Servlet, décrite plus bas dans le paragraphe « Java », aura la lourde tâche de récupérer le fichier et d’en lire le contenu.
  • Pour permettre le traitement du fichier en arrière plan sans que l’utilisateur se rende compte de quoi que ce soit, le formulaire pointe en cible sur une iframe nommée « target_upload », la réponse de la Servlet va écrire dans cette balise <iframe> :

Java

La récupération du fichier en JavaScript étant impossible, il nous faut la contribution de notre serveur Java qui, grâce à la bibliothèque d’Apache Commons nommé FileUpload, va permettre de récupérer le fichier provenant du poste utilisateur pour le stocker sur le serveur ou pour le lire directement en mémoire.

Dans mon cas je lis les fichiers en mémoire car ceux-ci sont très petits et sont automatiquement rejetés s’ils dépassent une certaine taille (1 mo).

  • La Servlet se configure naturellement au niveau du fichier web.xml :
  • Le contenu de la Servlet est le suivant, nous pouvons distinguer 3 étapes distinctes :
  1. dans un premier temps elle récupère la liste des fichiers sélectionnés et passés dans la requête
  2. chaque fichier est lu en mémoire ou stocké sur le serveur (code commenté)
  3. la Servlet retourne dans sa réponse un appel à une fonction JavaScript, window.top.terminateFileUpload(), qui marquera la fin du chargement du fichier (window.top permet de sortir de l’iframe cible)

JavaScript

La fin de la récupération du fichier et de la lecture de son contenu est marquée par un appel JavaScript via la méthode terminateFileUpload(), c’est un peu le callback d’un appel Ajax. Cette méthode fait à peu près ce que vous voulez, dans mon cas elle permet d’afficher le contenu du fichier que j’ai préalablement stocké en session depuis la Servlet (code non présent dans l’exemple) via un appel DWR.

Trois flèches vers le bas

1- Logiciel de brouillage d’adresse IP :

Contourner la censure en surfant anonyme

2- L’article explicatif :

La différence entre un proxy et un VPN

3- Comment espionner un smartphone (app) :

L’application de référence

Commentez ici

  • Greg 4 juin 2011, 2 02

    Voilà qui va être utile à certains ; pour la peine je tweete l’article !

  • Siham 1 janvier 2012, 17 05

    Merci bcp pur ce super article
    merci bcp:)

  • houssem 29 avril 2013, 21 09

    esque sa marche pour de gros fichiers par exemple de 8 go

Article suivant:

Article précédent:

Share This