martes, 2 de febrero de 2016

Subir archivos al Servidor con Spring MVC - Java Config

En este artículo vamos a ver cómo configurar Spring MVC mediante Java para subir archivos al servidor mediante un ejemplo, que como siempre, subiré el código completo a Github.

Un formulario multiparte, es decir cuando establecemos enctype="multipart/form-data", divide el formulario por campos cada uno con su propio tipo, en Spring MVC es bastante sencillo que nuestro controlador procese solicitudes multiparte, y poder subir archivos al servidor.

En primer lugar debemos configurar el solucionador multiparte (MultipartResolver), ya que el DispatcherServlet delega esta tarea en esta interfaz y para ello tenemos dos opciones:
  • StandardServletMultipartResolver 
  • CommonsMultipartResolver
En proyectos con versiones anteriores a Spring 3.1 o si estas utilizando un contenedor de servlets que no soporta la versión 3.0 deberías utilizar CommonsMultipartResolver, y aunque ya ha llovido desde todo esto hay muchos proyectos utilizando estas versiones antiguas, yo voy a utilizar el solucionador Standard.

Para ello simplemente necesitamos declarar un bean en nuestra clase WebConfig que extiende de WebMvcConfigureAdapter:


@Bean
    public MultipartResolver multipartResolver() throws IOException {        
        return new StandardServletMultipartResolver();
    }

Ahora es obligatorio especificar un directorio temporal donde almacenar los archivos para que pueda funcionar, pero el MultipartResolver no se encarga de ello, como tampoco se encarga de especificar el tamaño máximo del archivo, por lo que tendremos que configurar estos detalles en nuestro DispatcherServlet, y esto se hace en nuestra clase TutorialWebAppInitializer o a la clase que extienda de AbstractAnnotationConfigDispatcherServletInitializer. y sobrescribir el método customizeRegistration. (Existen configuraciones basadas en Java de Spring MVC alternativas pero me voy a ceñir a la que llevo utilizando en los tutoriales anteriores)

Voy a utilizar el directorio temporal del sistema operativo System.getProperty("java.io.tmpdir")  voy a especificar un tamaño máximo de archivo de 2 Megas, el tamaño máximo del formulario en 8 y establecer el valor fileSizeThreshold en 0 para que se guarden en disco directamente.
(https://docs.oracle.com/javaee/7/tutorial/servlets011.htm)


@Override
    protected void customizeRegistration(Dynamic registration) {
        String location = System.getProperty("java.io.tmpdir");    
                
        MultipartConfigElement configElement = 
                new MultipartConfigElement(location,2*1024*1024,8*1024*1024,0);        
        
        registration.setMultipartConfig(configElement);
    }


Con los dos pasos anteriores ya hemos terminado la configuración, ahora queda ver nuestro jsp y el controlador.
El formulario no hace falta explicarlo pero aquí lo dejo:


<form method="POST" action="uploadFile" enctype="multipart/form-data">
   File to upload: <input type="file" name="file"><br />
   <input type="submit" value="Upload"> Press here to upload the file!
</form>

Y el controlador tampoco tiene ningún misterio, tal vez que he utilizado el directorio webapps  de tomcat para subir los ficheros, ya que si lo hiciera en el WEB-INF al subir una nueva versión de la aplicación podríamos borraríamos lo existente.


@Controller
public class HomeController {
    
    private static String filePath = System.getProperty("catalina.home") + File.separator + "webapps"+File.separator+"images"+File.separator;                
    
    @RequestMapping(value = "/")
    public String home(Model model) {        
        return "home";
    }
    
    @RequestMapping(value = "uploadFile", method = RequestMethod.POST)
    public String uploadFile(@RequestParam("file")MultipartFile image) { 
        
        if(!image.isEmpty()) {
            try {
                image.transferTo(new File(filePath+image.getOriginalFilename()));                
            } catch(Exception e) {
                                
            }
        }        
        return "home";
    }    
}

Con cada tutorial de Spring MVC vamos incrementando la configuración, como podéis ver en el código fuente en Github, en la entrega siguiente ya nos vamos a lanzar a por las bases de datos, en este caso con JDBC, y posteriormente Hibernate.

No hay comentarios:

Publicar un comentario