Spring MVC Multiple File Upload Example
- By Viral Patel on November 7, 2012
In this simple tutorial we will see how to implement multiple file upload in a Spring 3 MVC based application.
The requirement is simple. We have a form which displays file input component. User selects a file and upload it. Also its possible to add more file input components using Add button. Once the files are selected and uploaded, the file names are displayed on success page.
1. Maven Dependencies / Required JAR files
If you using Maven in your project for dependency management, you’ll need to add dependencies for Apache Common File upload and Apache Common IO libraries. The spring’sCommonsMultipartResolver
class internal uses these library to handle uploaded content.
Add following dependencies in your maven based project to add File upload feature.
< dependencies > <!-- Spring 3 MVC --> < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-webmvc</ artifactId > < version >3.1.2.RELEASE</ version > </ dependency > <!-- Apache Commons file upload --> < dependency > < groupId >commons-fileupload</ groupId > < artifactId >commons-fileupload</ artifactId > < version >1.2.2</ version > </ dependency > <!-- Apache Commons IO --> < dependency > < groupId >org.apache.commons</ groupId > < artifactId >commons-io</ artifactId > < version >1.3.2</ version > </ dependency > <!-- JSTL for c: tag --> < dependency > < groupId >jstl</ groupId > < artifactId >jstl</ artifactId > < version >1.2</ version > </ dependency > </ dependencies > |
If you have a simple web application, add following JAR files in WEB-INF/lib folder. You can download all these JARs with source code at the end of this tutorial.
2. Model – Form Object
Create a Java bean which acts as Model/Form object for our Spring application. This bean contains aList
of org.springframework.web.multipart.MultipartFile
objects. Spring framework provides a useful class MultipartFile which can be used to fetch the file content of uploaded file. Apart from its content, the MultipartFile object also gives you other useful information such as filename, file size etc.
FileUploadForm.java
package net.viralpatel.spring3.form; import java.util.List; import org.springframework.web.multipart.MultipartFile; public class FileUploadForm { private List<MultipartFile> files; //Getter and setter methods } |
3. Controller – Spring Controller
Create a Spring 3 MVC based controller which handles file upload. There are two methods in this controller:
displayForm
– Is a used to show input form to user. It simply forwards to the page file_upload_form.jspsave
– Fetches the form using@ModelAttribute
annotation and get the File content from it. It creates a list of filenames of files being uploaded and pass this list to success page.
FileUploadController.java
package net.viralpatel.spring3.controller; import java.util.ArrayList; import java.util.List; import net.viralpatel.spring3.form.FileUploadForm; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller public class FileUploadController { @RequestMapping (value = "/show" , method = RequestMethod.GET) public String displayForm() { return "file_upload_form" ; } @RequestMapping (value = "/save" , method = RequestMethod.POST) public String save( @ModelAttribute ( "uploadForm" ) FileUploadForm uploadForm, Model map) { List<MultipartFile> files = uploadForm.getFiles(); List<String> fileNames = new ArrayList<String>(); if ( null != files && files.size() > 0 ) { for (MultipartFile multipartFile : files) { String fileName = multipartFile.getOriginalFilename(); fileNames.add(fileName); //Handle file content - multipartFile.getInputStream() } } map.addAttribute( "files" , fileNames); return "file_upload_success" ; } } |
4. View – JSP views
Now create the view pages for this application. We will need two JSPs, one to display file upload form and another to show result on successful upload.
The file_upload_form.jsp displays a form with file input. Apart from this we have added small jquery snippet onclick of Add button. This will add a new file input component at the end of form. This allows user to upload as many files as they want (subjected to file size limit ofcourse).
Note that we have set enctype=”multipart/form-data” attribute of our <form> tag.
file_upload_form.jsp
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> < html > < head > < title >Spring MVC Multiple File Upload</ title > < script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" > </script> <script> $(document).ready( function () { //add more file components if Add is clicked $( '#addFile' ).click( function () { var fileIndex = $( '#fileTable tr' ).children().length - 1; $( '#fileTable' ).append( '<tr><td>' + ' <input type="file" name="files[' + fileIndex + ']" />' + '</td></tr>' ); }); }); </script> </ head > < body > < h1 >Spring Multiple File Upload example</ h1 > < form:form method = "post" action = "save.html" modelAttribute = "uploadForm" enctype = "multipart/form-data" > < p >Select files to upload. Press Add button to add more file inputs.</ p > < input id = "addFile" type = "button" value = "Add File" /> < table id = "fileTable" > < tr > < td >< input name = "files[0]" type = "file" /></ td > </ tr > < tr > < td >< input name = "files[1]" type = "file" /></ td > </ tr > </ table > < br />< input type = "submit" value = "Upload" /> </ form:form > </ body > </ html > |
Note that we defined the file input name as files[0], files[1] etc. This will map the submitted files to the List
I would suggest you to go through this tutorial to understand how Spring maps multiple entries from form to bean: Multiple Row Form Submit using List of Beans
Second view page is to display filename of uploaded file. It simply loops through filename list and display the names.
file_upload_success.jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> < html > < head > < title >Spring MVC Multiple File Upload</ title > </ head > < body > < h1 >Spring Multiple File Upload example</ h1 > < p >Following files are uploaded successfully.</ p > < ol > < c:forEach items = "${files}" var = "file" > < li >${file}</ li > </ c:forEach > </ ol > </ body > </ html > |
5. Spring Configuration
In Spring configuration (spring-servlet.xml) we define several important configurations. Note how we defined bean multipartResolver. This will make sure Spring handles the file upload correctly usingCommonsMultipartResolver
class.
spring-servlet.xml
<? 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:context = "http://www.springframework.org/schema/context" xmlns:mvc = "http://www.springframework.org/schema/mvc" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd" > < context:annotation-config /> < context:component-scan base-package = "net.viralpatel.spring3.controller" /> < bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" /> < bean id = "jspViewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > < property name = "viewClass" value = "org.springframework.web.servlet.view.JstlView" /> < property name = "prefix" value = "/WEB-INF/jsp/" /> < property name = "suffix" value = ".jsp" /> </ bean > </ beans > |
6. Output
Execute the project in Eclipse. Open following URL in browser to see file upload form.
URL: http://localhost:8080/Spring3MVC_Multiple_File_Upload_example/show.html
Select files through file dialog and press Upload button to upload. Following page will displayed with list of files being uploaded.
We have added a small Javascript snippet for Add button. This will add more file upload components to the page. Use this if you want to upload more files.
Download Source Code
출처 - http://viralpatel.net/blogs/spring-mvc-multiple-file-upload-example/
'Framework & Platform > Spring' 카테고리의 다른 글
spring - mvc file download(파일 다운로드) (0) | 2013.07.21 |
---|---|
spring data - mongodb gridfs example (0) | 2013.07.20 |
spring data - mongoTemplate embedded document insert (0) | 2013.07.13 |
spring - Array @ModelAttribute expansion in Spring MVC (0) | 2013.06.27 |
spring - 폼 태그(form tag) (0) | 2013.06.21 |
mongoTemplate.updateFirst(Query.query(Criteria.where("username").is("username_1")), new Update().push("posts", newPostObject), User.class);
I think I got a bit confused because I was trying to user theUpdate
class statically - like i've seen done in many examples - and this did not allow thepush
method. – chrisjleu Jun 7 '12 at 20:50