My web application front-end code is built using HTML5, CSS3, and jQuery, using the Spring MVC 3.0 Framework to get back-end data back to the browser. We use the WizardPro jQuery library to aid the user in creating objects in the webapp (WizardPro is a great little jQuery library that enables you to create an object in a few steps).
Here is where my heartache comes in – WizardPro’s default form submit uses XMLHttpRequest. Don’t get me wrong, most of the time the default behavior works great! Specifically, it doesn’t work is when you need file uploads in your web app, therefore requiring an input type of file as a form control. Luckily, Spring MVC 3.0 fileupload support was available in our toolkit already (it provides a MultipartResolver for use with Apache Commons FileUpload). To be able to make file uploads work with WizardPro and Spring MVC file upload, you must do the following:
1. For the Spring MultipartHttpServletRequest to work, set WizardPro’s defaultAjaxRequest attribute to false when the wizard is instantiated.
2. WizardPro uses a default form class called .defaultRequest, this makes sure the plugin handles the default form ajax requests submits and validation. Make a copy of the .defaultRequest CSS classes and name it uniquely, i.e. .defaultRequest2. In the form tag, set the class to this new class name, so the class will not bind wizardPro to use default ajax submits. Instead WizardPro will use normal HTML form submits with the file input form control for file uploads.
<form class=”defaultRequest” action=”someUrl” method=”post” enctype=”application/x-www-form-urlencoded”>
<form class=”defaultRequest2” action=”someUrl” method=”post” enctype=”multipart/form-data“>
3. Set the encode type to multipart/form-data in the form tag, MultipartHttpServletRequest filter expects this. Example in number 2 above.
When you follow the above steps, along with setting up Spring MVC’s multipartResolver in the servlet context spring configuration file, ensuring the form action URL and the controller @RequestMapping match, etc, then WizardPro and file uploads work great together!
P.S. You may ask me, “Why not use an HTML5/AJAX supported file upload library?”. Uploadrr is a great little library that does this, and I’ve tested it using Firefox 3 and Chrome 10, with both @RequestParam using MultipartFile and also with the HttpServletRequest Input Stream to get the file byte data. Unfortunately, it does not work for our primary browser platform, IE8, which is why (for now at least), we can’t integrate this into the webapp.