493: Undecipherable

-Blog-

-Projects-

-Urlaub-

-About me-

-RSS-

JSF 2.0: Mojarra and multipart/form-data (File Upload) [Glassfish]

Dennis Guse

It is a quite a mess that Mojarra doesn't support h:forms that use enctyp multipart/form-data, because you can't access possible available parts in the JSF Controllers.

The following wrapper extends a HttpServletRequest so that getParameter also uses available data in HttpServletRequest.getParts().

You can than access the HttpServletRequest via FacesContext.getCurrentInstance().getExternalContext() and use getParts own your own.

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.util.HashMap;
 6 import java.util.Map;
 7 import java.util.logging.Level;
 8 import java.util.logging.Logger;
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletRequestWrapper;
12 import javax.servlet.http.Part;
13 
14 /**
15  * The mojarra implementation does not parse POST request that are multipart encoded, 
16  * because the parameters are not accessable via <code>getParameter()</code>.
17  *
18  * This class extends the HttpServletRequest to provide access to the parameters
19  * which are encoded accessable via <code>getParts</code>.
20  *
21  * All parts are made visible that have <code>contentType == null && size < 300</code>.
22  *
23  * If the request is not multipart encoded, the wrapper doesn't modify the behavior of the original <code>HttpServletRequest</code>.
24  * @author dennis
25  */
26 public class MultipartHTTPServletRequest extends HttpServletRequestWrapper {
27 
28     protected Map<String, String> parameterParts = new HashMap<String, String>();
29 
30     public MultipartHTTPServletRequest(HttpServletRequest request) {
31         super(request);
32 
33         if (getContentType() == null) {
34             return;
35         }
36         if (!getContentType().toLowerCase().startsWith("multipart/")) {
37             return;
38         }
39         try {
40             for (Part i : getParts()) {
41                 if (i.getContentType() == null && i.getSize() < 300) {
42                     parameterParts.put(i.getName(), getData(i.getInputStream()));
43                 }
44             }
45         } catch (IOException ex) {
46             Logger.getLogger(MultipartHTTPServletRequest.class.getName()).log(Level.SEVERE, null, ex);
47         } catch (ServletException ex) {
48             Logger.getLogger(MultipartHTTPServletRequest.class.getName()).log(Level.SEVERE, null, ex);
49         }
50     }
51 
52     private static String getData(InputStream input) throws IOException {
53         String data = "";
54         String line = "";
55         BufferedReader reader = new BufferedReader(new InputStreamReader(input));
56         while ((line = reader.readLine()) != null) {
57             data += line;
58         }
59         return data;
60     }
61 
62     @Override
63     public String getParameter(String name) {
64         String result = super.getParameter(name);
65         if (result == null) {
66             return parameterParts.get(name);
67         }
68         return result;
69     }
70 }