001
014
015 package com.liferay.portal.upload;
016
017 import com.liferay.portal.kernel.exception.SystemException;
018 import com.liferay.portal.kernel.io.ByteArrayFileInputStream;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.upload.FileItem;
022 import com.liferay.portal.kernel.upload.UploadException;
023 import com.liferay.portal.kernel.upload.UploadServletRequest;
024 import com.liferay.portal.kernel.util.ArrayUtil;
025 import com.liferay.portal.kernel.util.FileUtil;
026 import com.liferay.portal.kernel.util.PropsKeys;
027 import com.liferay.portal.kernel.util.SystemProperties;
028 import com.liferay.portal.kernel.util.Validator;
029 import com.liferay.portal.util.PrefsPropsUtil;
030 import com.liferay.portal.util.WebKeys;
031
032 import java.io.File;
033 import java.io.IOException;
034 import java.io.InputStream;
035
036 import java.util.ArrayList;
037 import java.util.Collections;
038 import java.util.Enumeration;
039 import java.util.HashMap;
040 import java.util.LinkedHashMap;
041 import java.util.LinkedHashSet;
042 import java.util.List;
043 import java.util.Map;
044 import java.util.Set;
045
046 import javax.servlet.ServletInputStream;
047 import javax.servlet.http.HttpServletRequest;
048 import javax.servlet.http.HttpServletRequestWrapper;
049
050 import org.apache.commons.fileupload.FileUploadBase;
051 import org.apache.commons.fileupload.servlet.ServletFileUpload;
052
053
059 public class UploadServletRequestImpl
060 extends HttpServletRequestWrapper implements UploadServletRequest {
061
062 public static File getTempDir() throws SystemException {
063 if (_tempDir == null) {
064 _tempDir = new File(
065 PrefsPropsUtil.getString(
066 PropsKeys.UPLOAD_SERVLET_REQUEST_IMPL_TEMP_DIR,
067 SystemProperties.get(SystemProperties.TMP_DIR)));
068 }
069
070 return _tempDir;
071 }
072
073 public static void setTempDir(File tempDir) {
074 _tempDir = tempDir;
075 }
076
077 public UploadServletRequestImpl(HttpServletRequest request) {
078 super(request);
079
080 _fileParameters = new LinkedHashMap<String, FileItem[]>();
081 _regularParameters = new LinkedHashMap<String, List<String>>();
082
083 try {
084 ServletFileUpload servletFileUpload = new LiferayFileUpload(
085 new LiferayFileItemFactory(getTempDir()), request);
086
087 servletFileUpload.setSizeMax(
088 PrefsPropsUtil.getLong(
089 PropsKeys.UPLOAD_SERVLET_REQUEST_IMPL_MAX_SIZE));
090
091 _liferayServletRequest = new LiferayServletRequest(request);
092
093 List<LiferayFileItem> liferayFileItemsList =
094 servletFileUpload.parseRequest(_liferayServletRequest);
095
096 for (LiferayFileItem liferayFileItem : liferayFileItemsList) {
097 if (liferayFileItem.isFormField()) {
098 liferayFileItem.setString(request.getCharacterEncoding());
099
100 String fieldName = liferayFileItem.getFieldName();
101
102 if (!_regularParameters.containsKey(fieldName)) {
103 _regularParameters.put(
104 fieldName, new ArrayList<String>());
105 }
106
107 List<String> values = _regularParameters.get(fieldName);
108
109 values.add(liferayFileItem.getString());
110
111 continue;
112 }
113
114 FileItem[] liferayFileItems = _fileParameters.get(
115 liferayFileItem.getFieldName());
116
117 if (liferayFileItems == null) {
118 liferayFileItems = new LiferayFileItem[] {liferayFileItem};
119 }
120 else {
121 LiferayFileItem[] newLiferayFileItems =
122 new LiferayFileItem[liferayFileItems.length + 1];
123
124 System.arraycopy(
125 liferayFileItems, 0, newLiferayFileItems, 0,
126 liferayFileItems.length);
127
128 newLiferayFileItems[newLiferayFileItems.length - 1] =
129 liferayFileItem;
130
131 liferayFileItems = newLiferayFileItems;
132 }
133
134 _fileParameters.put(
135 liferayFileItem.getFieldName(), liferayFileItems);
136 }
137 }
138 catch (Exception e) {
139 UploadException uploadException = new UploadException(e);
140
141 if (e instanceof FileUploadBase.FileSizeLimitExceededException ||
142 e instanceof FileUploadBase.SizeLimitExceededException ) {
143
144 uploadException.setExceededSizeLimit(true);
145 }
146
147 request.setAttribute(WebKeys.UPLOAD_EXCEPTION, uploadException);
148
149 if (_log.isDebugEnabled()) {
150 _log.debug(e, e);
151 }
152 }
153 }
154
155 public UploadServletRequestImpl(
156 HttpServletRequest request, Map<String, FileItem[]> fileParams,
157 Map<String, List<String>> regularParams) {
158
159 super(request);
160
161 _fileParameters = new LinkedHashMap<String, FileItem[]>();
162 _regularParameters = new LinkedHashMap<String, List<String>>();
163
164 if (fileParams != null) {
165 _fileParameters.putAll(fileParams);
166 }
167
168 if (regularParams != null) {
169 _regularParameters.putAll(regularParams);
170 }
171 }
172
173 @Override
174 public void cleanUp() {
175 if ((_fileParameters != null) && !_fileParameters.isEmpty()) {
176 for (FileItem[] liferayFileItems : _fileParameters.values()) {
177 for (FileItem liferayFileItem : liferayFileItems) {
178 liferayFileItem.delete();
179 }
180 }
181 }
182 }
183
184 @Override
185 public String getContentType(String name) {
186 FileItem[] liferayFileItems = _fileParameters.get(name);
187
188 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
189 FileItem liferayFileItem = liferayFileItems[0];
190
191 return liferayFileItem.getContentType();
192 }
193
194 return null;
195 }
196
197 @Override
198 public File getFile(String name) {
199 return getFile(name, false);
200 }
201
202 @Override
203 public File getFile(String name, boolean forceCreate) {
204 if (getFileName(name) == null) {
205 return null;
206 }
207
208 FileItem[] liferayFileItems = _fileParameters.get(name);
209
210 if ((liferayFileItems == null) || (liferayFileItems.length == 0)) {
211 return null;
212 }
213
214 FileItem liferayFileItem = liferayFileItems[0];
215
216 long size = liferayFileItem.getSize();
217
218 if ((size > 0) && (size <= liferayFileItem.getSizeThreshold())) {
219 forceCreate = true;
220 }
221
222 File file = liferayFileItem.getStoreLocation();
223
224 if (liferayFileItem.isInMemory() && forceCreate) {
225 try {
226 FileUtil.write(file, liferayFileItem.getInputStream());
227 }
228 catch (IOException ioe) {
229 if (_log.isWarnEnabled()) {
230 _log.warn(
231 "Unable to write temporary file " +
232 file.getAbsolutePath(),
233 ioe);
234 }
235 }
236 }
237
238 return file;
239 }
240
241 @Override
242 public InputStream getFileAsStream(String name) throws IOException {
243 return getFileAsStream(name, true);
244 }
245
246 @Override
247 public InputStream getFileAsStream(String name, boolean deleteOnClose)
248 throws IOException {
249
250 if (getFileName(name) == null) {
251 return null;
252 }
253
254 InputStream inputStream = null;
255
256 FileItem[] liferayFileItems = _fileParameters.get(name);
257
258 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
259 FileItem liferayFileItem = liferayFileItems[0];
260
261 inputStream = getInputStream(liferayFileItem, deleteOnClose);
262 }
263
264 return inputStream;
265 }
266
267 @Override
268 public String getFileName(String name) {
269 FileItem[] liferayFileItems = _fileParameters.get(name);
270
271 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
272 FileItem liferayFileItem = liferayFileItems[0];
273
274 return liferayFileItem.getFileName();
275 }
276
277 return null;
278 }
279
280 @Override
281 public String[] getFileNames(String name) {
282 FileItem[] liferayFileItems = _fileParameters.get(name);
283
284 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
285 String[] fileNames = new String[liferayFileItems.length];
286
287 for (int i = 0; i < liferayFileItems.length; i++) {
288 FileItem liferayFileItem = liferayFileItems[i];
289
290 fileNames[i] = liferayFileItem.getFileName();
291 }
292
293 return fileNames;
294 }
295
296 return null;
297 }
298
299 @Override
300 public File[] getFiles(String name) {
301 String[] fileNames = getFileNames(name);
302
303 if (fileNames == null) {
304 return null;
305 }
306
307 FileItem[] liferayFileItems = _fileParameters.get(name);
308
309 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
310 File[] files = new File[liferayFileItems.length];
311
312 for (int i = 0; i < liferayFileItems.length; i++) {
313 FileItem liferayFileItem = liferayFileItems[i];
314
315 if (Validator.isNotNull(liferayFileItem.getFileName())) {
316 files[i] = liferayFileItem.getStoreLocation();
317 }
318 }
319
320 return files;
321 }
322
323 return null;
324 }
325
326 @Override
327 public InputStream[] getFilesAsStream(String name) throws IOException {
328 return getFilesAsStream(name, true);
329 }
330
331 @Override
332 public InputStream[] getFilesAsStream(String name, boolean deleteOnClose)
333 throws IOException {
334
335 String[] fileNames = getFileNames(name);
336
337 if (fileNames == null) {
338 return null;
339 }
340
341 InputStream[] inputStreams = null;
342
343 FileItem[] liferayFileItems = _fileParameters.get(name);
344
345 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
346 inputStreams = new InputStream[liferayFileItems.length];
347
348 for (int i = 0; i < liferayFileItems.length; i++) {
349 FileItem liferayFileItem = liferayFileItems[i];
350
351 if (Validator.isNotNull(liferayFileItem.getFileName())) {
352 inputStreams[i] = getInputStream(
353 liferayFileItem, deleteOnClose);
354 }
355 }
356 }
357
358 return inputStreams;
359 }
360
361 @Override
362 public String getFullFileName(String name) {
363 FileItem[] liferayFileItems = _fileParameters.get(name);
364
365 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
366 FileItem liferayFileItem = liferayFileItems[0];
367
368 return liferayFileItem.getFullFileName();
369 }
370
371 return null;
372 }
373
374 @Override
375 public ServletInputStream getInputStream() throws IOException {
376 return _liferayServletRequest.getInputStream();
377 }
378
379 @Override
380 public Map<String, FileItem[]> getMultipartParameterMap() {
381 return _fileParameters;
382 }
383
384 @Override
385 public String getParameter(String name) {
386 List<String> values = _regularParameters.get(name);
387
388 if ((values != null) && !values.isEmpty()) {
389 return values.get(0);
390 }
391
392 return super.getParameter(name);
393 }
394
395 @Override
396 public Map<String, String[]> getParameterMap() {
397 Map<String, String[]> map = new HashMap<String, String[]>();
398
399 Enumeration<String> enu = getParameterNames();
400
401 while (enu.hasMoreElements()) {
402 String name = enu.nextElement();
403
404 map.put(name, getParameterValues(name));
405 }
406
407 return map;
408 }
409
410 @Override
411 public Enumeration<String> getParameterNames() {
412 Set<String> parameterNames = new LinkedHashSet<String>();
413
414 Enumeration<String> enu = super.getParameterNames();
415
416 while (enu.hasMoreElements()) {
417 parameterNames.add(enu.nextElement());
418 }
419
420 parameterNames.addAll(_regularParameters.keySet());
421 parameterNames.addAll(_fileParameters.keySet());
422
423 return Collections.enumeration(parameterNames);
424 }
425
426 @Override
427 public String[] getParameterValues(String name) {
428 String[] parameterValues = null;
429
430 List<String> values = _regularParameters.get(name);
431
432 if (values != null) {
433 parameterValues = values.toArray(new String[values.size()]);
434 }
435
436 String[] parentParameterValues = super.getParameterValues(name);
437
438 if (parameterValues == null) {
439 return parentParameterValues;
440 }
441 else if (parentParameterValues == null) {
442 return parameterValues;
443 }
444
445 return ArrayUtil.append(parameterValues, parentParameterValues);
446 }
447
448 @Override
449 public Map<String, List<String>> getRegularParameterMap() {
450 return _regularParameters;
451 }
452
453 @Override
454 public Long getSize(String name) {
455 FileItem[] liferayFileItems = _fileParameters.get(name);
456
457 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
458 FileItem liferayFileItem = liferayFileItems[0];
459
460 return new Long(liferayFileItem.getSize());
461 }
462
463 return null;
464 }
465
466 @Override
467 public Boolean isFormField(String name) {
468 FileItem[] liferayFileItems = _fileParameters.get(name);
469
470 if ((liferayFileItems != null) && (liferayFileItems.length > 0)) {
471 FileItem liferayFileItem = liferayFileItems[0];
472
473 return new Boolean(liferayFileItem.isFormField());
474 }
475
476 return null;
477 }
478
479 protected InputStream getInputStream(
480 FileItem liferayFileItem, boolean deleteOnClose)
481 throws IOException {
482
483 InputStream inputStream = null;
484
485 if (liferayFileItem.isInMemory() && (liferayFileItem.getSize() > 0)) {
486 inputStream = liferayFileItem.getInputStream();
487 }
488 else if (!liferayFileItem.isInMemory()) {
489 inputStream = new ByteArrayFileInputStream(
490 liferayFileItem.getStoreLocation(),
491 liferayFileItem.getSizeThreshold(), deleteOnClose);
492 }
493
494 return inputStream;
495 }
496
497 private static Log _log = LogFactoryUtil.getLog(
498 UploadServletRequestImpl.class);
499
500 private static File _tempDir;
501
502 private Map<String, FileItem[]> _fileParameters;
503 private LiferayServletRequest _liferayServletRequest;
504 private Map<String, List<String>> _regularParameters;
505
506 }