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