@@ -66,19 +66,41 @@ public class AjaxFileUploadServlet extends HttpServlet {
6666 @ Override
6767 protected void doPost (HttpServletRequest httpRequest , HttpServletResponse response )
6868 throws ServletException , IOException {
69+
6970 if (isPostFileUploadRequest (httpRequest )) {
70- logger .fine ("......add files ..." );
71+ logger .info ("......file upload request received ..." );
7172 List <FileData > fileDataList = getFilesFromRequest (httpRequest );
72- // now update the workitem....
73+
74+ // null signals a FileTooLargeException from Undertow
75+ if (fileDataList == null ) {
76+ // Read maxFileSize from context-param or fall back to @MultipartConfig
77+ String configValue = getServletContext ().getInitParameter ("imixs.fileupload.maxFileSize" );
78+ MultipartConfig annotation = this .getClass ().getAnnotation (MultipartConfig .class );
79+ long maxFileSize = (configValue != null )
80+ ? Long .parseLong (configValue )
81+ : annotation .maxFileSize ();
82+
83+ logger .warning ("......upload aborted - file too large, maxFileSize=" + maxFileSize );
84+ response .setStatus (HttpServletResponse .SC_REQUEST_ENTITY_TOO_LARGE );
85+ response .setContentType ("application/json;charset=UTF-8" );
86+ PrintWriter out = response .getWriter ();
87+ out .write ("{ \" error\" : \" FILE_TOO_LARGE\" , \" maxFileSize\" : " + maxFileSize + " }" );
88+ out .close ();
89+ return ;
90+ }
91+
92+ logger .info ("......processing " + fileDataList .size () + " file(s)..." );
7393 if (fileUploadController != null ) {
74- // check workitem... issue
7594 if (fileUploadController .getWorkitem () != null ) {
76- logger .fine ("......prüfe file data Liste..." );
7795 for (FileData filedata : fileDataList ) {
78- logger .fine ("......add new fileData object... " + filedata .getName ());
96+ logger .info ("......adding fileData: " + filedata .getName ());
7997 fileUploadController .addFileUpload (filedata );
8098 }
99+ } else {
100+ logger .warning ("......workitem is null - files cannot be stored" );
81101 }
102+ } else {
103+ logger .warning ("......fileUploadController is null" );
82104 }
83105 writeJsonMetadata (response , httpRequest .getRequestURI ());
84106 }
@@ -186,50 +208,35 @@ private String getFilename(Part part) {
186208 */
187209 private List <FileData > getFilesFromRequest (HttpServletRequest httpRequest ) {
188210 logger .finest ("......Looping parts" );
189-
190211 List <FileData > fileDataList = new ArrayList <FileData >();
191212 try {
192213 for (Part p : httpRequest .getParts ()) {
193214 byte [] b = new byte [(int ) p .getSize ()];
194215 p .getInputStream ().read (b );
195216 p .getInputStream ().close ();
196- // params.put(p.getName(), new String[] { new String(b) });
197-
198- // test if part contains a file
199217 String fileName = getFilename (p );
200218 if (fileName != null ) {
201-
202- /*
203- * issue #106
204- *
205- * https://developer.jboss.org/message/941661#941661
206- *
207- * Here we test of the encoding and try to convert to utf-8.
208- */
209219 byte fileNameISOBytes [] = fileName .getBytes ("iso-8859-1" );
210220 String fileNameUTF8 = new String (fileNameISOBytes , "UTF-8" );
211221 if (fileName .length () != fileNameUTF8 .length ()) {
212- // convert to utf-8
213222 logger .finest ("......filename seems to be ISO-8859-1 encoded" );
214223 fileName = new String (fileName .getBytes ("iso-8859-1" ), "utf-8" );
215224 }
216-
217- // extract the file content...
218- FileData fileData = null ;
219- logger .log (Level .FINEST , "......filename : {0}, contentType {1}" ,
220- new Object [] { fileName , p .getContentType () });
221- fileData = new FileData (fileName , b , p .getContentType (), null );
225+ FileData fileData = new FileData (fileName , b , p .getContentType (), null );
222226 fileDataList .add (fileData );
223-
227+ logger . info ( "......file added: " + fileName + " size: " + b . length + " bytes" );
224228 }
225229 }
226-
230+ } catch (IllegalStateException ex ) {
231+ // Undertow wraps FileTooLargeException in an IllegalStateException
232+ logger .warning ("......file upload rejected - file too large: " + ex .getMessage ());
233+ // Signal the error to the caller by returning null
234+ return null ;
227235 } catch (IOException ex ) {
228236 logger .log (Level .SEVERE , null , ex );
229237 } catch (ServletException ex ) {
230238 logger .log (Level .SEVERE , null , ex );
231239 }
232-
233240 return fileDataList ;
234241 }
235242
0 commit comments