1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.filters;
35
36 import info.magnolia.cms.beans.runtime.MultipartForm;
37 import info.magnolia.cms.core.Path;
38 import info.magnolia.context.MgnlContext;
39
40 import java.io.IOException;
41 import java.util.Enumeration;
42 import java.util.Map;
43
44 import javax.servlet.FilterChain;
45 import javax.servlet.ServletException;
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletRequestWrapper;
48 import javax.servlet.http.HttpServletResponse;
49
50 import org.apache.commons.lang.StringUtils;
51
52 import com.oreilly.servlet.MultipartRequest;
53
54
55
56
57
58
59 public class CosMultipartRequestFilter extends AbstractMgnlFilter {
60
61
62
63
64 private static final int MAX_FILE_SIZE = 2000000000;
65
66 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
67 throws IOException, ServletException {
68
69 String type = null;
70 String type1 = request.getHeader("Content-Type");
71 String type2 = request.getContentType();
72 if (type1 == null && type2 != null) {
73 type = type2;
74 }
75 else if (type2 == null && type1 != null) {
76 type = type1;
77 }
78 else if (type1 != null) {
79 type = (type1.length() > type2.length() ? type1 : type2);
80 }
81 boolean isMultipart = (type != null) && type.toLowerCase().startsWith("multipart/form-data");
82 if (isMultipart) {
83 MultipartForm mpf = parseParameters(request);
84 request = new MultipartRequestWrapper(request, mpf);
85 MgnlContext.push(request, response);
86 }
87 chain.doFilter(request, response);
88 if (isMultipart) {
89 MgnlContext.pop();
90 }
91 }
92
93
94
95
96
97 private static MultipartForm parseParameters(HttpServletRequest request) throws IOException {
98 MultipartForm form = new MultipartForm();
99 String encoding = StringUtils.defaultString(request.getCharacterEncoding(), "UTF-8");
100 MultipartRequest multi = new MultipartRequest(
101 request,
102 Path.getTempDirectoryPath(),
103 MAX_FILE_SIZE,
104 encoding,
105 null);
106 Enumeration params = multi.getParameterNames();
107 while (params.hasMoreElements()) {
108 String name = (String) params.nextElement();
109 String value = multi.getParameter(name);
110 form.addParameter(name, value);
111 String[] s = multi.getParameterValues(name);
112 if (s != null) {
113 form.addparameterValues(name, s);
114 }
115 }
116 Enumeration files = multi.getFileNames();
117 while (files.hasMoreElements()) {
118 String name = (String) files.nextElement();
119 form.addDocument(name, multi.getFilesystemName(name), multi.getContentType(name), multi.getFile(name));
120 }
121 request.setAttribute(MultipartForm.REQUEST_ATTRIBUTE_NAME, form);
122 return form;
123 }
124
125 static class MultipartRequestWrapper extends HttpServletRequestWrapper {
126
127 private MultipartForm form;
128
129
130
131
132 public MultipartRequestWrapper(HttpServletRequest request, MultipartForm form) {
133 super(request);
134 this.form = form;
135 }
136
137
138
139
140
141 public String getParameter(String name) {
142 String value = form.getParameter(name);
143 return value;
144 }
145
146
147
148
149
150 public Map getParameterMap() {
151 return form.getParameters();
152 }
153
154
155
156
157
158 public Enumeration getParameterNames() {
159 return form.getParameterNames();
160 }
161
162
163
164
165
166 public String[] getParameterValues(String name) {
167 String[] value = form.getParameterValues(name);
168 return value;
169 }
170 }
171 }