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