001
014
015 package com.liferay.portal.upload;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.upload.UploadServletRequest;
020 import com.liferay.portal.kernel.util.GetterUtil;
021 import com.liferay.portal.util.PropsUtil;
022 import com.liferay.util.SystemProperties;
023
024 import java.io.File;
025 import java.io.IOException;
026
027 import java.util.Collections;
028 import java.util.Enumeration;
029 import java.util.HashMap;
030 import java.util.LinkedHashMap;
031 import java.util.LinkedHashSet;
032 import java.util.List;
033 import java.util.Map;
034 import java.util.Set;
035
036 import javax.servlet.ServletInputStream;
037 import javax.servlet.http.HttpServletRequest;
038 import javax.servlet.http.HttpServletRequestWrapper;
039
040 import org.apache.commons.fileupload.FileUploadException;
041 import org.apache.commons.fileupload.servlet.ServletFileUpload;
042
043
048 public class UploadServletRequestImpl
049 extends HttpServletRequestWrapper implements UploadServletRequest {
050
051 public static final long DEFAULT_SIZE_MAX = GetterUtil.getLong(
052 PropsUtil.get(UploadServletRequestImpl.class.getName() + ".max.size"));
053
054 public static final File DEFAULT_TEMP_DIR = new File(
055 GetterUtil.getString(PropsUtil.get(
056 UploadServletRequestImpl.class.getName() + ".temp.dir"),
057 SystemProperties.get(SystemProperties.TMP_DIR)));
058
059 public UploadServletRequestImpl(HttpServletRequest request) {
060 super(request);
061
062 _params = new LinkedHashMap<String, LiferayFileItem[]>();
063
064 try {
065 ServletFileUpload servletFileUpload = new LiferayFileUpload(
066 new LiferayFileItemFactory(DEFAULT_TEMP_DIR), request);
067
068 servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
069
070 _lsr = new LiferayServletRequest(request);
071
072 List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
073
074 for (LiferayFileItem fileItem : list) {
075 if (fileItem.isFormField()) {
076 fileItem.setString(request.getCharacterEncoding());
077 }
078
079 LiferayFileItem[] fileItems = _params.get(
080 fileItem.getFieldName());
081
082 if (fileItems == null) {
083 fileItems = new LiferayFileItem[] {fileItem};
084 }
085 else {
086 LiferayFileItem[] newFileItems =
087 new LiferayFileItem[fileItems.length + 1];
088
089 System.arraycopy(
090 fileItems, 0, newFileItems, 0, fileItems.length);
091
092 newFileItems[newFileItems.length - 1] = fileItem;
093
094 fileItems = newFileItems;
095 }
096
097 _params.put(fileItem.getFieldName(), fileItems);
098 }
099 }
100 catch (FileUploadException fue) {
101 _log.error(fue, fue);
102 }
103 }
104
105 public void cleanUp() {
106 if ((_params != null) && !_params.isEmpty()) {
107 for (LiferayFileItem[] fileItems : _params.values()) {
108 for (int i = 0; i < fileItems.length; i++) {
109 fileItems[i].delete();
110 }
111 }
112 }
113 }
114
115 public String getContentType(String name) {
116 LiferayFileItem[] fileItems = _params.get(name);
117
118 if ((fileItems != null) && (fileItems.length > 0)) {
119 return fileItems[0].getContentType();
120 }
121 else {
122 return null;
123 }
124 }
125
126 public File getFile(String name) {
127 if (getFileName(name) == null) {
128 return null;
129 }
130
131 LiferayFileItem[] fileItems = _params.get(name);
132
133 if ((fileItems != null) && (fileItems.length > 0)) {
134 return fileItems[0].getStoreLocation();
135 }
136 else {
137 return null;
138 }
139 }
140
141 public String getFileName(String name) {
142 LiferayFileItem[] fileItems = _params.get(name);
143
144 if ((fileItems != null) && (fileItems.length > 0)) {
145 return fileItems[0].getFileName();
146 }
147 else {
148 return null;
149 }
150 }
151
152 public String getFullFileName(String name) {
153 LiferayFileItem[] fileItems = _params.get(name);
154
155 if ((fileItems != null) && (fileItems.length > 0)) {
156 return fileItems[0].getFullFileName();
157 }
158 else {
159 return null;
160 }
161 }
162
163 public ServletInputStream getInputStream() throws IOException {
164 return _lsr.getInputStream();
165 }
166
167 public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
168 return _params;
169 }
170
171 public String getParameter(String name) {
172 LiferayFileItem[] fileItems = _params.get(name);
173
174 if ((fileItems != null) && (fileItems.length > 0)) {
175 return fileItems[0].getString();
176 }
177 else {
178 return super.getParameter(name);
179 }
180 }
181
182 public Map<String, String[]> getParameterMap() {
183 Map<String, String[]> map = new HashMap<String, String[]>();
184
185 Enumeration<String> enu = getParameterNames();
186
187 while (enu.hasMoreElements()) {
188 String name = enu.nextElement();
189
190 map.put(name, getParameterValues(name));
191 }
192
193 return map;
194 }
195
196 public Enumeration<String> getParameterNames() {
197 Set<String> parameterNames = new LinkedHashSet<String>();
198
199 Enumeration<String> enu = super.getParameterNames();
200
201 while (enu.hasMoreElements()) {
202 String name = enu.nextElement();
203
204 if (!_params.containsKey(name)) {
205 parameterNames.add(name);
206 }
207 }
208
209 parameterNames.addAll(_params.keySet());
210
211 return Collections.enumeration(parameterNames);
212 }
213
214 public String[] getParameterValues(String name) {
215 String[] parentValues = super.getParameterValues(name);
216
217 LiferayFileItem[] fileItems = _params.get(name);
218
219 if ((fileItems == null) || (fileItems.length == 0)) {
220 return parentValues;
221 }
222 else if ((parentValues == null) || (parentValues.length == 0)) {
223 String[] values = new String[fileItems.length];
224
225 for (int i = 0; i < values.length; i++) {
226 values[i] = fileItems[i].getString();
227 }
228
229 return values;
230 }
231 else {
232 String[] values = new String[
233 parentValues.length + fileItems.length];
234
235 System.arraycopy(
236 parentValues, 0, values, 0, parentValues.length);
237
238 for (int i = parentValues.length; i < values.length; i++) {
239 values[i] = fileItems[i - parentValues.length].getString();
240 }
241
242 return values;
243 }
244 }
245
246 public Boolean isFormField(String name) {
247 LiferayFileItem[] fileItems = _params.get(name);
248
249 if ((fileItems != null) && (fileItems.length > 0)) {
250 return new Boolean(fileItems[0].isFormField());
251 }
252 else {
253 return null;
254 }
255 }
256
257 private static Log _log = LogFactoryUtil.getLog(
258 UploadServletRequestImpl.class);
259
260 private LiferayServletRequest _lsr;
261 private Map<String, LiferayFileItem[]> _params;
262
263 }