Spring MVC - Ejemplo de carga de archivos
El siguiente ejemplo muestra cómo usar File Upload Control en formularios usando el marco Spring Web MVC. Para empezar, tengamos un IDE de Eclipse en funcionamiento y sigamos los siguientes pasos para desarrollar una aplicación web basada en formularios dinámicos utilizando Spring Web Framework.
Paso | Descripción |
---|---|
1 | Cree un proyecto con un nombre HelloWeb en un paquete com.tutorialspoint como se explica en el capítulo Spring MVC - Hello World. |
2 | Cree clases Java FileModel, FileUploadController en el paquete com.tutorialspoint. |
3 | Cree archivos de vista fileUpload.jsp, success.jsp en la subcarpeta jsp. |
4 | Crea una carpeta temp en la subcarpeta WebContent. |
5 | Descargue la biblioteca Apache Commons FileUpload commons-fileupload.jar y la biblioteca Apache Commons IO commons-io.jar . Ponlos en tu CLASSPATH. |
6 | El paso final es crear el contenido de los archivos fuente y de configuración y exportar la aplicación como se explica a continuación. |
FileModel.java
package com.tutorialspoint;
import org.springframework.web.multipart.MultipartFile;
public class FileModel {
private MultipartFile file;
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
FileUploadController.java
package com.tutorialspoint;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class FileUploadController {
@Autowired
ServletContext context;
@RequestMapping(value = "/fileUploadPage", method = RequestMethod.GET)
public ModelAndView fileUploadPage() {
FileModel file = new FileModel();
ModelAndView modelAndView = new ModelAndView("fileUpload", "command", file);
return modelAndView;
}
@RequestMapping(value="/fileUploadPage", method = RequestMethod.POST)
public String fileUpload(@Validated FileModel file, BindingResult result, ModelMap model) throws IOException {
if (result.hasErrors()) {
System.out.println("validation errors");
return "fileUploadPage";
} else {
System.out.println("Fetching file");
MultipartFile multipartFile = file.getFile();
String uploadPath = context.getRealPath("") + File.separator + "temp" + File.separator;
//Now do something with file...
FileCopyUtils.copy(file.getFile().getBytes(), new File(uploadPath+file.getFile().getOriginalFilename()));
String fileName = multipartFile.getOriginalFilename();
model.addAttribute("fileName", fileName);
return "success";
}
}
}
HelloWeb-servlet.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:context = "http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint" />
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value = "/WEB-INF/jsp/" />
<property name = "suffix" value = ".jsp" />
</bean>
<bean id = "multipartResolver"
class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" />
</beans>
Aquí, para el primer método de servicio fileUploadPage(), hemos pasado un espacio en blanco FileModelobjeto en el objeto ModelAndView con el nombre "comando", porque el marco de Spring espera un objeto con el nombre "comando", si está utilizando etiquetas <formulario: formulario> en su archivo JSP. Así que cuandofileUploadPage() se llama al método, devuelve fileUpload.jsp ver.
El segundo método de servicio fileUpload() se llamará contra un método POST en el HelloWeb/fileUploadPageURL. Preparará el archivo para cargar en función de la información enviada. Finalmente, se devolverá una vista de "éxito" del método de servicio, lo que dará como resultado la representación de success.jsp.
fileUpload.jsp
<%@ page contentType="text/html; charset = UTF-8" %>
<%@ taglib prefix = "form" uri = "http://www.springframework.org/tags/form"%>
<html>
<head>
<title>File Upload Example</title>
</head>
<body>
<form:form method = "POST" modelAttribute = "fileUpload"
enctype = "multipart/form-data">
Please select a file to upload :
<input type = "file" name = "file" />
<input type = "submit" value = "upload" />
</form:form>
</body>
</html>
Aquí, estamos usando modelAttribute atributo con value = "fileUpload" para mapear el control de carga de archivos con el modelo de servidor.
success.jsp
<%@ page contentType = "text/html; charset = UTF-8" %>
<html>
<head>
<title>File Upload Example</title>
</head>
<body>
FileName :
lt;b> ${fileName} </b> - Uploaded Successfully.
</body>
</html>
Una vez que haya terminado de crear archivos fuente y de configuración, exporte su aplicación. Haga clic derecho en su aplicación, useExport → WAR File y guarde el archivo HelloWeb.war en la carpeta webapps de Tomcat.
Ahora, inicie su servidor Tomcat y asegúrese de poder acceder a otras páginas web desde la carpeta webapps utilizando un navegador estándar. Prueba una URLhttp://localhost:8080/HelloWeb/fileUploadPage y veremos la siguiente pantalla, si todo está bien con la aplicación web Spring.
Después de enviar la información requerida, haga clic en el botón enviar para enviar el formulario. Debería ver la siguiente pantalla, si todo está bien con la aplicación web Spring.