Upload d’une application Flex vers une servlet Java.

Aie je vais sans doute aborder avec cet article un sujet tabou ;) Comment uploader un fichier depuis une application en Flash, vers un serveur J2EE comme Tomcat ou JBoss…


Histoire de mettre les choses au point immédiatement, je tiens à dire que j’ai bien peu de mérite car je me suis largement basé sur cet article pour écrire le mien.


  1. L’application Flex

Nous allons faire quelque chose de très simple ici car le principe d’upload d’un fichier ne diffère pas que ce soit vers du php, jsp ou autre asp. Cependant pour ceux qui veulent en apprendre d’avantage sur cette partie, voici un excellent tuto.


FileUploader.mxml

<?xml version= »1.0″ encoding= »utf-8″?>

<mx:Application

pageTitle= »Upload Example« 

layout= »absolute« 

creationComplete= »doCreationComplete( event ) »

xmlns:mx= »http://www.adobe.com/2006/mxml« >

<mx:Script>

<![CDATA[

public var file:FileReference = new FileReference();

public function doCreationComplete( event:Event ):void

{

file.addEventListener( Event.SELECT, doSubmit );

file.browse();

}


public function doSubmit( event:Event ):void

{

var request:URLRequest = new URLRequest( "http://localhost:9000/TestUpload/UploadExample" );

file.upload( request );

}

]]>

</mx:Script>

</mx:Application>


Voilà, rien de bien compliqué. La seule chose à retenir ici, est l’url vers notre servlet passé en URLRequest lors de l’upload.



  1. La servlet JAVA

Avant d’aborder le fonctionnement de notre servlet, prenons garde aux dependances. La premiere librairie à avoir est FileUpload qui provient du projet Apache Commons. Celle-ci a besoin de la librairie IO, toujours du meme projet.


Voyons maintenant à quoi va ressembler notre servlet :

UploadServlet.java

package org.tamina.core.io;

import java.io.File;

import java.io.IOException;

import java.util.Iterator;

import java.util.List;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class UploadServlet extends HttpServlet

{

public void doPost( HttpServletRequest req, HttpServletResponse res )

{


File disk = null;

FileItem item = null;

FileItemFactory factory = new DiskFileItemFactory();

Iterator iter = null;

List items = null;

ServletFileUpload upload = new ServletFileUpload( factory );

ServletOutputStream out = null;

try

{

items = upload.parseRequest( req );

iter = items.iterator();

res.setContentType( « text/xml » );

out = res.getOutputStream();

out.println( « <response> » );

while( iter.hasNext() )

{

item = ( FileItem )iter.next();

if( item.isFormField() )

{

out.println( « <field name=\ »" + item.getFieldName() + « \ » value=\ »" + item.getString() + « \ » /> » );

} else {

String path = getServletContext().getRealPath(getInitParameter(« uploadPath »)) + « / » + item.getName();

disk = new File( path );

item.write( disk );

out.println( « <file name=\ »" + item.getName() + « \ » size=\ »" + item.getSize() + « \ » path=\ »" + getInitParameter(« uploadPath ») + « / » + item.getName() + « \ » /> » );

}

}

out.println( « </response> » );

out.close();

} catch( FileUploadException fue ) {

fue.printStackTrace();

} catch( IOException ioe ) {

ioe.printStackTrace();

} catch( Exception e ) {

e.printStackTrace();

}

}

}


On notera qu’elle utilise le paramètre « uploadPath » pour déterminer l’endroit où sauvegarder le fichier uploadé. Elle construit également un bout de xml qui sera utilisé en réponse au Flex. En effet, lors de la réussite de l’upload,un événement DataEvent.UPLOAD_COMPLETE_DATA est diffusé. Celui-ci possède une propriete text qui va contenir notre bout de xml.


  1. Configuration Web.xml

Il ne nous reste plus qu’a configurer le web.xml pour pouvoir utiliser notre servlet depuis Flex. Pour ça on va rajouter ces quelques lignes :

<servlet>

<servlet-name>UploadExample</servlet-name>

<servlet-class>org.tamina.core.io.UploadServlet</servlet-class>

<init-param>

<param-name>uploadPath</param-name>

<param-value>assets/temp</param-value>

</init-param>

</servlet>


<servlet-mapping>

<servlet-name>UploadExample</servlet-name>

<url-pattern>/UploadExample</url-pattern>

</servlet-mapping>


Concretement ici nous créons une référence à notre classe sous le nom de UploadExample, que l’on map sur l’url /UploadExemple. On en profite aussi pour lui préciser le chemin à utiliser pour stoker les fichiers ainsi uploadé, grâce au paramètre uploadPath.


Et voilà le travail, maintenans plus rien ne peut nous empecher d’uploader des fichiers vers un serveur J2EE, ni de conquerir le monde. Mouahahahahaah :)

Tags: , , , ,

One Response to “Upload d’une application Flex vers une servlet Java.”

  1. Jérôme Ruillier dit :

    Bonjour,

    Tout d’abord, merci pour cet article simple et efficace !

    Qu’en est il pour un upload dans un environnement sécurisé ? (full HTTPS + authentification JAAS via BlazeDS)
    En effet, selon nos tests, le ‘Principal’ n’est pas propagé à la servlet…

    Cordialement,