1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.util.http;
35
36 import fr.paris.lutece.portal.service.html.EncodingService;
37 import fr.paris.lutece.portal.service.util.AppLogService;
38 import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
39 import fr.paris.lutece.portal.web.upload.NormalizeFileItem;
40
41 import org.apache.commons.fileupload.FileItem;
42 import org.apache.commons.fileupload.FileItemIterator;
43 import org.apache.commons.fileupload.FileItemStream;
44 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
45 import org.apache.commons.fileupload.FileUploadException;
46 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
47 import org.apache.commons.fileupload.servlet.ServletFileUpload;
48 import org.apache.commons.lang3.StringUtils;
49
50 import java.io.UnsupportedEncodingException;
51
52 import java.util.ArrayList;
53 import java.util.HashMap;
54 import java.util.List;
55 import java.util.Map;
56 import java.util.Optional;
57
58 import javax.servlet.http.HttpServletRequest;
59
60
61
62
63
64
65 public final class MultipartUtil
66 {
67
68
69
70 private MultipartUtil( )
71 {
72 }
73
74
75
76
77
78
79
80
81 public static boolean isMultipart( HttpServletRequest request )
82 {
83 return ServletFileUpload.isMultipartContent( request );
84 }
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 public static MultipartHttpServletRequest convert( int nSizeThreshold, long nRequestSizeMax, boolean bActivateNormalizeFileName,
104 HttpServletRequest request ) throws FileUploadException
105 {
106 if ( !isMultipart( request ) )
107 {
108 return null;
109 }
110
111
112 DiskFileItemFactory factory = new DiskFileItemFactory( );
113
114
115 factory.setSizeThreshold( nSizeThreshold );
116
117
118 ServletFileUpload upload = new ServletFileUpload( factory );
119
120
121 upload.setSizeMax( nRequestSizeMax );
122
123
124 String strEncoding = Optional.ofNullable( request.getCharacterEncoding( ) ).orElse( EncodingService.getEncoding( ) );
125
126 Map<String, List<FileItem>> mapFiles = new HashMap<>( );
127 Map<String, String [ ]> mapParameters = new HashMap<>( );
128
129 List<FileItem> listItems;
130
131 try {
132 listItems = upload.parseRequest(request);
133 }
134 catch( SizeLimitExceededException e )
135 {
136 closeInputStream( upload, request );
137 throw e;
138 }
139
140
141 for ( FileItem item : listItems )
142 {
143 processItem( item, strEncoding, bActivateNormalizeFileName, mapFiles, mapParameters );
144 }
145
146 return new MultipartHttpServletRequest( request, mapFiles, mapParameters );
147 }
148
149
150
151
152
153
154 private static void closeInputStream( ServletFileUpload upload, HttpServletRequest request)
155 {
156 try {
157 upload.setSizeMax(-1);
158 FileItemIterator fileiterator = upload.getItemIterator(request);
159
160 while (fileiterator.hasNext())
161 {
162 FileItemStream item = fileiterator.next();
163 item.openStream().close();
164 }
165 }
166 catch (Exception e)
167 {
168 AppLogService.error( "error occured during closing the stream" , e);
169 }
170
171 }
172
173 private static void processItem( FileItem item, String strEncoding, boolean bActivateNormalizeFileName, Map<String, List<FileItem>> mapFiles,
174 Map<String, String [ ]> mapParameters )
175 {
176 if ( item.isFormField( ) )
177 {
178 String strValue = StringUtils.EMPTY;
179
180 if ( item.getSize( ) > 0 )
181 {
182 try
183 {
184 strValue = item.getString( strEncoding );
185 }
186 catch( UnsupportedEncodingException ex )
187 {
188
189 strValue = item.getString( );
190 }
191 }
192
193
194 String [ ] curParam = mapParameters.get( item.getFieldName( ) );
195
196 if ( curParam == null )
197 {
198
199 mapParameters.put( item.getFieldName( ), new String [ ] {
200 strValue
201 } );
202 }
203 else
204 {
205
206 String [ ] newArray = new String [ curParam.length + 1];
207 System.arraycopy( curParam, 0, newArray, 0, curParam.length );
208 newArray [curParam.length] = strValue;
209 mapParameters.put( item.getFieldName( ), newArray );
210 }
211 }
212 else
213 {
214
215
216
217 FileItem fileItem = bActivateNormalizeFileName ? new NormalizeFileItem( item ) : item;
218 List<FileItem> listFileItem = mapFiles.get( fileItem.getFieldName( ) );
219
220 if ( listFileItem != null )
221 {
222 listFileItem.add( fileItem );
223 }
224 else
225 {
226 listFileItem = new ArrayList<>( 1 );
227 listFileItem.add( fileItem );
228 mapFiles.put( fileItem.getFieldName( ), listFileItem );
229 }
230 }
231 }
232 }