1
22
23 package com.liferay.util.servlet;
24
25 import com.liferay.portal.kernel.util.GetterUtil;
26 import com.liferay.util.SystemProperties;
27 import com.liferay.util.servlet.fileupload.LiferayFileItem;
28 import com.liferay.util.servlet.fileupload.LiferayFileItemFactory;
29 import com.liferay.util.servlet.fileupload.LiferayFileUpload;
30 import com.liferay.util.servlet.fileupload.LiferayServletRequest;
31
32 import java.io.File;
33 import java.io.IOException;
34
35 import java.util.ArrayList;
36 import java.util.Collections;
37 import java.util.Enumeration;
38 import java.util.HashMap;
39 import java.util.LinkedHashMap;
40 import java.util.List;
41 import java.util.Map;
42
43 import javax.servlet.ServletInputStream;
44 import javax.servlet.http.HttpServletRequest;
45 import javax.servlet.http.HttpServletRequestWrapper;
46
47 import org.apache.commons.fileupload.FileUploadException;
48 import org.apache.commons.fileupload.servlet.ServletFileUpload;
49 import org.apache.commons.logging.Log;
50 import org.apache.commons.logging.LogFactory;
51
52
60 public class UploadServletRequest extends HttpServletRequestWrapper {
61
62 public static final int DEFAULT_SIZE_MAX = GetterUtil.getInteger(
63 SystemProperties.get(
64 UploadServletRequest.class.getName() + ".max.size"));
65
66 public static final File DEFAULT_TEMP_DIR = new File(
67 GetterUtil.getString(
68 SystemProperties.get(
69 UploadServletRequest.class.getName() + ".temp.dir"),
70 SystemProperties.get(SystemProperties.TMP_DIR)));
71
72 public UploadServletRequest(HttpServletRequest req)
73 throws IOException {
74
75 super(req);
76
77 _params = new LinkedHashMap<String, LiferayFileItem[]>();
78
79 try {
80 ServletFileUpload servletFileUpload = new LiferayFileUpload(
81 new LiferayFileItemFactory(DEFAULT_TEMP_DIR), req);
82
83 servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
84
85 _lsr = new LiferayServletRequest(req);
86
87 List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
88
89 for (LiferayFileItem fileItem : list) {
90 if (fileItem.isFormField()) {
91 fileItem.setString(req.getCharacterEncoding());
92 }
93
94 LiferayFileItem[] fileItems =
95 _params.get(fileItem.getFieldName());
96
97 if (fileItems == null) {
98 fileItems = new LiferayFileItem[] {fileItem};
99 }
100 else {
101 LiferayFileItem[] newFileItems =
102 new LiferayFileItem[fileItems.length + 1];
103
104 System.arraycopy(
105 fileItems, 0, newFileItems, 0, fileItems.length);
106
107 newFileItems[newFileItems.length - 1] = fileItem;
108
109 fileItems = newFileItems;
110 }
111
112 _params.put(fileItem.getFieldName(), fileItems);
113 }
114 }
115 catch (FileUploadException fue) {
116 _log.error(fue.getMessage());
117 }
118 }
119
120 public String getContentType(String name) {
121 LiferayFileItem[] fileItems = _params.get(name);
122
123 if ((fileItems != null) && (fileItems.length > 0)) {
124 return fileItems[0].getContentType();
125 }
126 else {
127 return null;
128 }
129 }
130
131 public File getFile(String name) {
132 if (getFileName(name) == null) {
133 return null;
134 }
135
136 LiferayFileItem[] fileItems = _params.get(name);
137
138 if ((fileItems != null) && (fileItems.length > 0)) {
139 return fileItems[0].getStoreLocation();
140 }
141 else {
142 return null;
143 }
144 }
145
146 public String getFileName(String name) {
147 LiferayFileItem[] fileItems = _params.get(name);
148
149 if ((fileItems != null) && (fileItems.length > 0)) {
150 return fileItems[0].getFileName();
151 }
152 else {
153 return null;
154 }
155 }
156
157 public String getFullFileName(String name) {
158 LiferayFileItem[] fileItems = _params.get(name);
159
160 if ((fileItems != null) && (fileItems.length > 0)) {
161 return fileItems[0].getFullFileName();
162 }
163 else {
164 return null;
165 }
166 }
167
168 public ServletInputStream getInputStream() throws IOException {
169 return _lsr.getInputStream();
170 }
171
172 public String getParameter(String name) {
173 LiferayFileItem[] fileItems = _params.get(name);
174
175 if ((fileItems != null) && (fileItems.length > 0)) {
176 return fileItems[0].getString();
177 }
178 else {
179 return super.getParameter(name);
180 }
181 }
182
183 public Map<String, String[]> getParameterMap() {
184 Map<String, String[]> map = new HashMap<String, String[]>();
185
186 Enumeration<String> enu = getParameterNames();
187
188 while (enu.hasMoreElements()) {
189 String name = enu.nextElement();
190
191 map.put(name, getParameterValues(name));
192 }
193
194 return map;
195 }
196
197 public Enumeration<String> getParameterNames() {
198 List<String> parameterNames = new ArrayList<String>();
199
200 Enumeration<String> enu = super.getParameterNames();
201
202 while (enu.hasMoreElements()) {
203 String name = enu.nextElement();
204
205 if (!_params.containsKey(name)) {
206 parameterNames.add(name);
207 }
208 }
209
210 for (String name : _params.keySet()) {
211 parameterNames.add(name);
212 }
213
214 return Collections.enumeration(parameterNames);
215 }
216
217 public String[] getParameterValues(String name) {
218 String[] parentValues = super.getParameterValues(name);
219
220 LiferayFileItem[] fileItems = _params.get(name);
221
222 if ((fileItems == null) || (fileItems.length == 0)) {
223 return parentValues;
224 }
225 else if ((parentValues == null) || (parentValues.length == 0)) {
226 String[] values = new String[fileItems.length];
227
228 for (int i = 0; i < values.length; i++) {
229 values[i] = fileItems[i].getString();
230 }
231
232 return values;
233 }
234 else {
235 String[] values = new String[
236 parentValues.length + fileItems.length];
237
238 System.arraycopy(
239 parentValues, 0, values, 0, parentValues.length);
240
241 for (int i = parentValues.length; i < values.length; i++) {
242 values[i] = fileItems[i - parentValues.length].getString();
243 }
244
245 return values;
246 }
247 }
248
249 public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
250 return _params;
251 }
252
253 public Boolean isFormField(String name) {
254 LiferayFileItem[] fileItems = _params.get(name);
255
256 if ((fileItems != null) && (fileItems.length > 0)) {
257 return new Boolean(fileItems[0].isFormField());
258 }
259 else {
260 return null;
261 }
262 }
263
264 public void cleanUp() {
265 if ((_params != null) && !_params.isEmpty()) {
266 for (LiferayFileItem[] fileItems : _params.values()) {
267 for (int i = 0; i < fileItems.length; i++) {
268 fileItems[i].delete();
269 }
270 }
271 }
272 }
273
274 private static Log _log = LogFactory.getLog(UploadServletRequest.class);
275
276 private LiferayServletRequest _lsr;
277 private Map<String, LiferayFileItem[]> _params;
278
279 }