Upload AJAX + JSP avec iframe et apache.commons.fileupload

Upload AJAX + JSP avec iframe et apache.commons.fileupload - Java - Programmation

Marsh Posté le 11-09-2009 à 20:45:57    

Bonsoir à tous,
 
Comme indiqué dans le sujet, je cherche à uploader un fichier client par Ajax avec l'API d'Apache.
Je débute à peine avec Ajax, mais ai lu sur différents sites que normalement Ajax ne permet pas l'envoi de fichier.
J'ai lu toutefois qu'il était possible de feinter en utilisant une iframe ( ça m'échappe pour le moment ).
J'essaie donc cette technique, mais sans résultat pour le moment :(
 
Voici donc mon code actuel :
 - côte HTML :

Code :
  1. <FORM method="POST" name="ATTACHFORM" enctype="multipart/form-data; boundary=--_01C922E9.D3E367F0" target="myFrame" >
  2. <div id="NEW_FIC" style="display:'<%=displayNewFic%>';">
  3.         <input size="1" id="newpj" name="newpj" onchange="submitDoc();" type="file"/>
  4. </div>
  5. </FORM>
  6. <iframe id="myFrame" name="myFrame"></iframe>

 
 - côté js :
 

Code :
  1. function submitDoc()
  2.         {
  3.                 http.open("POST", url , true);
  4.                 http.onreadystatechange = handleHttpResponse;
  5.                 http.setRequestHeader("Content-Type", "multipart/form-data; boundary=--_01C922E9.D3E367F0" );
  6.                 data = "noAD=test";
  7.                 http.send(data);
  8. }


 - côté JSP :

Code :
  1. boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  2. FileItemFactory factory = new DiskFileItemFactory();
  3. ServletFileUpload upload = new ServletFileUpload(factory);
  4. List items = upload.parseRequest(request);
  5. Iterator iter = items.iterator();
  6. while (iter.hasNext()) {
  7.     FileItem item = (FileItem) iter.next();
  8.     if (item.isFormField()) {
  9. ...    } else {
  10.     File uploadedFile = new File(...);
  11.     }
  12. }

       
 
Mon problème est donc que items est toujours de taille = 0.
Je ne sais pas si cela vient du boundary que je ne précise pas dans la récupération ( si oui comment faire ? ) ou alors si il y a qqchose à faire avec l'iframe en javascript...  
Merci à l'avance pour toute aide, je sèche complètement et ne veux me résilier à faire des allers-retours serveur...


---------------
The only survivor of the national peoples gang
Reply

Marsh Posté le 11-09-2009 à 20:45:57   

Reply

Marsh Posté le 13-09-2009 à 00:49:01    

Pas la peine de te casser la tête à simuler l'envoi d'un formulaire multipart/form-data en Ajax: tu l'as dit toi-même, XMLHttpRequest ne permet pas d'envoyer des fichiers. Dans la fonction submitDoc(), tu dois juste commander la soumission du formulaire. Donne-lui un id et spécifie comme action l'URL de ta JSP qui réceptionne les fichiers:
 

Code :
  1. <form id="attachform" name="attachform" method="post" action="/upload.jsp" enctype="multipart/form-data" target="myFrame">


 
Ensuite dans la fonction submitDoc:
 

Code :
  1. function submitDoc()
  2. {
  3.   document.getElementById("attachform" ).submit();
  4. }


 
Et boum, la JSP reçoit le fichier.

Reply

Marsh Posté le 13-09-2009 à 09:05:21    

Merci beaucoup pour ta réponse.
En fait mon upload se fait lui meme dans une popup, donc ta solution voudrait dire, envoyer le fichier au contoleur, qui renverrait à ma page "mère" et qui ouvrirait la popup avec tous les paramètres ad hoc. Je veux a tout prix éviter cela justement.
Or, j'ai lu une astuce sur un upload avec iframe + ajax, par exemple ici
Mais quelque chose doit m'échapper, d'où ma demande d'aide...
Autre exemple : ici.


---------------
The only survivor of the national peoples gang
Reply

Marsh Posté le 13-09-2009 à 18:34:31    

Et bien c'est ce que tu fais, tu places une iframe dans ta page et dans ton formulaire tu as le paramètre:
 

Code :
  1. target="myFrame"


 
donc c'est l'iframe qui reçoit la page en retour, ni vu ni connu.

Reply

Marsh Posté le 13-09-2009 à 19:26:23    

Ok donc en fait les titres des sites que j'ai lus portaient à confusion car il n'y a pas du d'Ajax en fait, c'est ça ?


---------------
The only survivor of the national peoples gang
Reply

Marsh Posté le 13-09-2009 à 21:33:45    

Comment comprends tu l'exemple présent ici  ?
A quoi sert Ajax dans ce cas là selon toi ?


---------------
The only survivor of the national peoples gang
Reply

Marsh Posté le 14-09-2009 à 05:23:37    

Dans l'exemple que tu me montres, Ajax est utilisé pour faire des requêtes GET répétées sur le serveur pendant l'upload, afin d'afficher à l'utilisateur la progression de l'upload. C'est aussi une façon de détecter quand l'upload est terminé afin de mettre à jour l'interface graphique de l'utilisateur. Mais l'upload proprement dit n'est pas fait en Ajax mais via un simple formulaire envoyé via POST à la même servlet (dans la servlet, la méthode doPost gère l'upload tandis que la méthode doGet renvoie le statut de l'upload sous la forme de données XML à la requête Ajax GET).
 
Si tu n'as pas besoin d'afficher la progression de l'upload, tu n'as pas besoin d'ajax et tu peux détecter la fin de l'upload en programmant ta servlet/JSP afin qu'à la fin de l'upload elle renvoie une page web avec un javascript, page web qui sera donc chargée dans l'iframe cachée et le javascript de cette page doit appeler une fonction dans la page parent (celle qui contient l'iframe) afin de notifier la fin de l'upload. Il peut aussi s'agir d'une fonction affichant un message d'erreur en cas d'erreur d'upload détectée par la servlet/JSP.

Reply

Marsh Posté le 14-09-2009 à 09:36:47    

Très bien, c'est très clair.
Merci infiniment pour tes réponses!


---------------
The only survivor of the national peoples gang
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed