Spring MVC Multipart Upload support for GAE
Downloads:
- gmultipart-0.1.jar - Works on Spring lib before 3.0 RC1.
- gmultipart-0.2.jar - Works on Spring lib 3.0 RC1
Overview:
This implementation removes all the file handling related codes from the following files to make it work in Google App Engine.
- org.springframework.web.multipart.commons
- CommonsFileUploadSupport.java --> GFileUploadSupport.java
- CommonsMultipartFile.java --> GMultipartFile.java
- CommonsMultipartResolver.java --> GMultipartResolver.java
- org.apache.commons.fileupload.disk
- org.apache.commons.io.output
Compile Time Dependencies (gmultipart-0.1.jar):
- commons-fileupload.jar
- commons-io.jar
- commons-logging.jar
- org.springframework.web-3.0.0.M4.jar / spring-webmvc.jar (2.5.6)
- org.springframework.core-3.0.0.M4.jar / spring-core.jar (2.5.6)
Compile Time Dependencies (gmultipart-0.2.jar):
- commons-fileupload.jar
- commons-io.jar
- commons-logging.jar
- org.springframework.web-3.0.0.RC1.jar
- org.springframework.core-3.0.0.RC1.jar
Demo:
- Edit your dispatcher-servlet.xml and add bean org.gmr.web.multipart.GMultipartResolver as shown below. Note: All the property settings that can be done in org.springframework.web.multipart.commons.CommonsMultipartResolver, can also be done in org.gmr.web.multipart.GMultipartResolver, except setting maxInMemorySize property. In this implementation, maxInMemorySize is defaults to maxUploadSize property value.
- Lets consider this simple multipart html form.
- Create a CommentForm.java to represent HTML form input fields 'comment', 'file1', 'file2', 'file3', 'file4', 'file5'.
- Create a CommentController.java to handle form post.
<bean id="multipartResolver" class="org.gmr.web.multipart.GMultipartResolver">
<property name="maxUploadSize" value="1048576" />
</bean><html>
<body>
<form action="/save" method="post" enctype="multipart/form-data">
<input name="comment">
<input name="file1" type="file">
<input name="file2" type="file">
<input name="file3" type="file">
<input name="file4" type="file">
<input name="file5" type="file">
</form>
</body>
</html>public class CommentForm {
private String comment;
private MultipartFile file1;
private MultipartFile file2;
private MultipartFile file3;
private MultipartFile file4;
private MultipartFile file5;
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public void setFile1(MultipartFile file1) {
this.file1 = file1;
}
public void setFile2(MultipartFile file2) {
this.file2 = file2;
}
public void setFile3(MultipartFile file3) {
this.file3 = file3;
}
public void setFile4(MultipartFile file4) {
this.file4 = file4;
}
public void setFile5(MultipartFile file5) {
this.file5 = file5;
}
public MultipartFile[] getFiles() {
List<MultipartFile> files = new ArrayList<MultipartFile>();
if (file1 != null) {
files.add(file1);
}
if (file2 != null) {
files.add(file2);
}
if (file3 != null) {
files.add(file3);
}
if (file4 != null) {
files.add(file4);
}
if (file5 != null) {
files.add(file5);
}
return files.toArray(new MultipartFile[files.size()]);
}
}@Controller
public class CommentController {
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String addComment(CommentForm commentForm) throws IOException {
MultipartFile[] files = commentForm.getFiles();
for (int i = 0; i < files.length; i++) {
// Do stuffs!!!
}
return "redirect:/saved"; // redirect after processing!!!
}
}