sábado, 24 de enero de 2009

Subir fichero a Servidor en Web Flow 2






Introducción


El objetivo de este tutorial es explicar paso a paso que necesitamos y como se sube un fichero a servidor.


-          Entorno:


-          Configuración del  Spring MVC.


-          Caso de estudio


Nota: Es necesario conocer web flow 2 y Spring 2.5.5


Nota: Esta guía resuelve el problema del multipart en los web-flow2.








Entorno


Para  poder seguir este manual es necesario es necesario tener,  las siguientes herramientas y configurado un proyecto con webFlow2.


-          Spring 2.5.5.


-          Log4j.


-          Spring MVC.


-          Spring web flow 2.


-          Jdk 1.5


-          Eclipse 3.4.1


A continuación listo los JAR, que tienen que estar instalados con las versiones correspondientes:




























































Fichero



Producto + Versión



Descripción



spring.jar



Spring 2.5.5



Es el core



spring-webmvc.jar



Spring 2.5.5



La parte del MVC.



commons-logging-1.1.1.jar



Commons-logging 1.1.1



Logs comunes



log4j-1.2.15.jar



log4j 1.2.15



 



jstl.jar



Jstl 1.1.2



JSTL 1.1 (Es el core no tiene tld)



standard.jar



Jstl 1.1.2



JSTL 1.1 (es donde están definidas las TLD).



ognl-2.6.9.jar



Ognl.2.6.9



Lo usa web-flow 2.



org.springframework.binding-2.0.3.RELEASE.jar



Web Flow 2



Lo utilizamos para bindear los objetos.



org.springframework.js-2.0.3.RELEASE.jar



Web Flow 2



La parte de Java script para web flow 2



org.springframework.webflow-2.0.3.RELEASE.jar



Web Flow 2



El core de web flow 2.



 







Configuración de Spring MVC


 



1º Librerias que necesitamos:


 


Ahora necesitamos instalar  dentro de spring 2.5 el fileUpload  (1.2.1) http://commons.apache.org/fileupload/ .


Nota: Para que funcione es necesario tener el Commons IO (1.4) http://commons.apache.org/io/  




















Fichero



Producto + Versión



Descripción



commons-fileupload-1.2.1.jar



Commons fileupload 1.2.1



Este Jar es para subir ficheros al Servidor.



commons-io-1.4.jar



commons io 1.4



Lo utiliza el fileUpload



 


Estos Jar los metemos en las librerías del proyecto



2º Configurar Spring MVC.


 


Ahora tenemos que añadir el multipartResolver  donde tengamos la configuración de nuestro fichero de Spring MVC .


<bean id ="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>








<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


       xsi:schemaLocation="


           http://www.springframework.org/schema/beans


           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


 


<!—Configuraciones de MVC  -->    


 


...


 


<!—Configurar el multipart à


 


 <bean id ="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>


     


</beans>



               


Ahora ya tenemos Spring MVC configurado para que podamos subir ficheros al servidor, con Spring MVC + WebFlow 2.


 







Caso de estudio:


 


Ahora que tenemos configurado todo y funcionando vamos a crear un ejemplo para probar la funcionalidad que va a consistir en:


-          Pantalla en la que metemos la imagen.


-          Action que recoge la imagen y la procesa (En nuestro caso la guardaremos en el disco duro).


-          Pantalla en la que mostramos la imagen.



Creación del Flujo correspondiente.


El flujo:


-          Ejecutamos el SetupForm.


-          Llamamos a la JSP correspondiente


-          Ejecutamos el  método que se encarga de gestionar la descarga.


-          Llamamos al JSP que nos va a mostrar la foro del servidor.


Flujo:








<?xml version="1.0" encoding="UTF-8"?>


<flow xmlns="http://www.springframework.org/schema/webflow"


      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"


      start-state="setupForm">


     


      <action-state id="setupForm" >


            <evaluate expression="formAction.setupForm" />


            <transition on="success" to="verDescarga"/>


      </action-state>     


 


 


      <view-state id="verDescarga" view="upload/descarga">


      <transition on="submit" to="descarga">


            <evaluate expression="formAction.bind" />


      </transition>


      </view-state>


      <action-state id="descarga" >


            <evaluate expression="formAction.descarga" />


            <transition on="success" to="verprueba2"/>


      </action-state>     


     


 


    <end-state id="verprueba2" view="upload/resultado">


      </end-state>     


      <bean-import resource="uploadFichero-beans.xml"/>


     


</flow>



La definición del bean.








<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


    xmlns:p="http://www.springframework.org/schema/p"


    xmlns:context="http://www.springframework.org/schema/context"


    xsi:schemaLocation="


        http://www.springframework.org/schema/beans


        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd


        http://www.springframework.org/schema/context


        http://www.springframework.org/schema/context/spring-context-2.5.xsd">


           


           


                                                      


            <bean id="formAction" class="spring.mvc.ejemplos.pingpong.action.FicheroUploadFormAction">


                  <property name="formObjectName"><value>form</value></property>


                  <property name="formObjectClass"><value>spring.mvc.ejemplos.pingpong.form.PruebaForm</value></property>


            </bean>        


     </beans>



 


 


Nota:  Para ejecutar el flujo se llama a la siguiente URL http://localhost:8080/<Despligue del proyecto>/<Controlador de web-flow>?_flowId=uploadFichero  . (Dependiendo de la configuración de nuestro entorno)


 


 







Creación del JSP donde vamos a meter la pantalla.


Los cambios o diferencias con un JSP normal son:


-          La definición del form hay que poner un enctype para indicar que es multipart:


enctype="multipart/form-data">


Nota: Con esto le indicamos que vamos a mandar un multipart.


-          Definimos un input para que el usario le pase el fichero:


<input type="file" name="file">


A continuación vemos un ejemplo de JSP de descarga, con los cambios que hemos indicado.








<%@ page language="java" contentType="text/html; charset=ISO-8859-1"


    pageEncoding="ISO-8859-1"%>


<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>


<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>


Prueba de la decarga de un Fichero


 


<!-- Indicamos el action -->


<form:form action="iv.do" method="post" enctype="multipart/form-data">


      <!-- Parametros necesarios para la configuracion -->


      <input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}"/>


      <input type="hidden" name="_eventId_submit" value="submit"/>


      <input type="hidden" name="_flowId" value="uploadFichero"/>


      </br>


            <table>


                  <tr>


                  <td>


                        File:


                  </td>


                  <td>


                        <input type="file" name="file">


                  </td>


            </tr>


            </table>


      <!-- Boton de subimit -->


      <input type="submit"  value="submit"/>


</form:form>



 








 



Creación del JSP donde vamos a mostrar la imagen.


Este Jsp solo tiene un img, con referencia a la ruta donde hemos guardado los datos:








<%@ page language="java" contentType="text/html; charset=ISO-8859-1"


    pageEncoding="ISO-8859-1"%>


<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


<IMG SRC="imagen.jpg">



 








Creación del Action que va procesar la información.


Aquí definimos el método de la descarga :


Para poder recoger el fichero del contexto como un multipart (“file”, es la referencia  de la request para recoger el fichero.):


MultipartFile file = context.getRequestParameters().getRequiredMultipartFile("file");


 


En file, podemos sacar el fichero, con los byte, pero tiene un método para transferir el fichero a una ubicación  física (Fichero es una variable de tipo file que indica la ruta donde vamos).


file.transferTo(fichero);


 








package spring.mvc.ejemplos.pingpong.action;


 


import java.io.File;


 


import org.springframework.web.multipart.MultipartFile;


import org.springframework.webflow.action.FormAction;


import org.springframework.webflow.execution.Event;


import org.springframework.webflow.execution.RequestContext;


/**


 *


 * Ejemplo para el caso de subir un fichero a servidor.


 *


 * @author tfc


 *


 */


public class FicheroUploadFormAction extends FormAction{


     


      /**


       * No hacemos nada de momento en el Setup Form


       */


      @Override


      public Event setupForm(RequestContext context) throws Exception {


            // TODO Auto-generated method stub


            return super.setupForm(context);


      }


      /**


       *


       * Encargada de subir el fichero a servidor.


       *


       * @param context


       * @return


       * @throws Exception


       */


      public Event descarga(RequestContext context) throws Exception {


            System.out.println("Descargar");


            MultipartFile file = context.getRequestParameters().getRequiredMultipartFile("file");


            System.out.println("Tamanio :" + file.getSize());


            System.out.println(" Nombre Longitud" + file.getContentType().toString());


            System.out.println(" Nombre Longitud" + file.getContentType().length());


            System.out.println(" Nombre originar " + file.getOriginalFilename().toString());


            System.out.println(" Nombre original longitud " + file.getOriginalFilename().length());


            //System.out.println("Nombre :" + file.getName());


            if (file.getSize() > 0) {


                  File fichero = new File("C:\\Users\\tfc\\pruebaDavid\\recursos\\imagen.jpg");


                  if(fichero.createNewFile()){


                        System.out.println("Se ha creado el fichero correctamente");


                  }


                file.transferTo(fichero);


                 


                  return success();


            } else {


                  return success();


            }


      }


}



 

No hay comentarios:

Publicar un comentario