En este post vamos a comprobar lo sencillo que es subir un fichero con Spring 3 MVC.
Spring MVC permite subir un fichero como campo de un formulario sin más que definiendo el atributo que se refiere al fichero de tipo CommonsMultipartFile
Para acelerar el desarrollo usaremos (que sorpresa verdad :)) Spring Roo (versión 1.2):
1. Creo mi proyecto Roo:
Roo>project –topLevelPackage es.luismi.spring3.mvc.subidaficheros
2. Configuro capacidades Web para el proyecto:
Roo> web mvc setup
3. Creo un controlador (en este caso no asociado a una entidad):
Roo>web mvc controller –class es.luismi.spring3.mvc.subidaficheros.control.UploadController –preferredMapping /upload
4. Creo la clase que representa los datos que vienen del formulario:
Roo> class –class es.luismi.spring3.mvc.subidaficheros.form.UploadElement
5. Edito el pom.xml para añadir la dependencia a commons-io necesario para hacer Upload:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.1</version>
</dependency>
6. Creo el proyecto de Eclipse
Roo>perform eclipse
Importo el proyecto en Eclipse y modifico la clase creando los atributos: comentarios y contenidoFichero:
package es.luismi.spring3.mvc.subidaficheros.form;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
@RooJavaBean
public class UploadElement {
private String comentarios;
private CommonsMultipartFile contenidoFichero;
}
7. Modifico el controlador para recibir esta petición, borro el método post y creo 2 métodos: create y show:
package es.luismi.spring3.mvc.subidaficheros.control;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import es.luismi.spring3.mvc.subidaficheros.form.UploadElement;
@RequestMapping("/upload/**")
@Controller
public class UploadController {
@RequestMapping(method = RequestMethod.GET)
public String show(Model model) {
model.addAttribute(new UploadElement());
return "upload/index";
}
@RequestMapping(method = RequestMethod.POST)
public String create(UploadElement uploadElement, BindingResult result) {
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
System.err.println("Error: " + error.getCode() + " – "
+ error.getDefaultMessage());
}
return "upload/index";
}
System.err.println("Comentarios: " + uploadElement.getComentarios());
System.err.println("Contenido fichero: " + uploadElement.getContenidoFichero().getOriginalFilename());
return "redirect:/";
}
}
8. Configuro en Spring MVC el MultipartResolver, en el fichero src/main/resources/META-INF/pring/applicationContext.xml añado:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000"/>
</bean>
9. Edito la jsp SRC_MAIN_WEBAPP/WEB-INF/views/upload/index.jspx para añadir el código para hacer la subida del fichero:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:form="http://www.springframework.org/tags/form" xmlns:spring="http://www.springframework.org/tags" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8"/>
<jsp:output omit-xml-declaration="yes"/>
<spring:message code="label_upload_index" htmlEscape="false" var="title"/>
<util:panel id="title" title="${title}">
<spring:message code="application_name" htmlEscape="false" var="app_name"/>
<h3>
<spring:message arguments="${app_name}" code="welcome_titlepane"/>
</h3>
</util:panel>
<form:form modelAttribute="uploadElement" method="post" enctype="multipart/form-data">
<fieldset>
<legend>Subida Ficheros</legend>
<p>
<form:label for="comentarios" path="comentarios">comentarios</form:label><br/>
<form:input path="comentarios"/>
</p>
<p>
<form:label for="contenidoFichero" path="contenidoFichero">Fichero</form:label><br/>
<form:input path="contenidoFichero" type="file"/>
</p>
<p>
<input type="submit" />
</p>
</fieldset>
</form:form>
</div>
10. Ejecuto mi aplicación, desde Maven por ejemplo con cmd>mvn tomcat:run
http://localhost:8080/subidaficheros/
Y voy a Upload Controller View:
El ejecutarlo en las trazas veré:



Deja un comentario