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