Tapestry 5
  1. Tapestry 5
  2. TAP5-272

File uploads that exceed the upload limit throw an uncatchable exception; Tapestry should notify the page about the exception

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 5.0.16
    • Component/s: None
    • Labels:
      None
    • Environment:
      Windows XP, Java 1.6, Sun Java Application Server 9.1

      Description

      When including the following code in my app module to limit file size on an upload:

      public void contributeApplicationDefaults(MappedConfiguration<String, String> configuration)

      { configuration.add(UploadSymbols.FILESIZE_MAX, "1500000"); }

      An following internal Tapestry exception gets thrown to the application server VM, which is of course uncatchable in application code.

      [#|2008-10-07T12:27:17.904-0400|SEVERE|Servlet.service() for servlet default threw exception
      java.lang.RuntimeException: Unable to decode multipart encoded request.
      at org.apache.tapestry5.upload.internal.services.MultipartDecoderImpl.parseRequest(MultipartDecoderImpl.java:116)
      at org.apache.tapestry5.upload.internal.services.MultipartDecoderImpl.decode(MultipartDecoderImpl.java:94)
      at $MultipartDecoder_11cd7ca67c8.decode($MultipartDecoder_11cd7ca67c8.java)
      at $MultipartDecoder_11cd7ca668e.decode($MultipartDecoder_11cd7ca668e.java)
      at org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:41)
      at $HttpServletRequestHandler_11cd7ca6691.service($HttpServletRequestHandler_11cd7ca6691.java)
      at org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
      at $HttpServletRequestFilter_11cd7ca668f.service($HttpServletRequestFilter_11cd7ca668f.java)
      at $HttpServletRequestHandler_11cd7ca6691.service($HttpServletRequestHandler_11cd7ca6691.java)
      at $HttpServletRequestHandler_11cd7ca668d.service($HttpServletRequestHandler_11cd7ca668d.java)
      at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:177)
      ......
      Caused by: org.apache.commons.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fileToUpload exceeds its maximum permitted size of 1500000 characters.
      at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:645)
      at org.apache.commons.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:71)
      at org.apache.commons.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:128)
      at java.io.FilterInputStream.read(FilterInputStream.java:90)
      at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
      at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
      at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:354)
      at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
      at org.apache.tapestry5.upload.internal.services.MultipartDecoderImpl.parseRequest(MultipartDecoderImpl.java:112)
      ... 61 more

        Issue Links

          Activity

          Joel Wiegman created issue -
          Joel Wiegman made changes -
          Field Original Value New Value
          Affects Version/s 5.0.14 [ 12313214 ]
          Fix Version/s 5.0.14 [ 12313214 ]
          Howard M. Lewis Ship made changes -
          Component/s tapestry-upload [ 12311811 ]
          Key TAPESTRY-2705 TAP5-272
          Project Tapestry [ 10573 ] Tapestry 5 [ 12310833 ]
          Affects Version/s 5.0.14 [ 12313214 ]
          Hide
          Howard M. Lewis Ship added a comment -

          The only solution I can see for this is to add an "incomplete" flag to the UploadedFile interface. I believe that once we hit this exception, we can't count on getting any other uploaded files, or potentially, any of the other query parameters. Possibly the correct course is to identify the page, and trigger a specific event to indicate the failure.

          Show
          Howard M. Lewis Ship added a comment - The only solution I can see for this is to add an "incomplete" flag to the UploadedFile interface. I believe that once we hit this exception, we can't count on getting any other uploaded files, or potentially, any of the other query parameters. Possibly the correct course is to identify the page, and trigger a specific event to indicate the failure.
          Howard M. Lewis Ship made changes -
          Assignee Howard M. Lewis Ship [ hlship ]
          Howard M. Lewis Ship made changes -
          Status Open [ 1 ] In Progress [ 3 ]
          Howard M. Lewis Ship made changes -
          Summary Exceeding file size limit throws uncatchable RuntimeException File uploads that exceed the upload limit throw an uncatchable exception; Tapestry should notify the page about the exception
          Howard M. Lewis Ship made changes -
          Resolution Fixed [ 1 ]
          Status In Progress [ 3 ] Closed [ 6 ]
          Fix Version/s 5.0.16 [ 12313427 ]
          Hide
          Howard M. Lewis Ship added a comment -

          Final solution is to notify the containing page with an uploadException event, let it decide what to do.

          Show
          Howard M. Lewis Ship added a comment - Final solution is to notify the containing page with an uploadException event, let it decide what to do.
          Hide
          Joel Wiegman added a comment -

          After working with the solution for this bug, it appears to be inconvenient.

          The uploadException appears to get thrown before the values from the form are bound to the page instance. So if I have the following code to handle the uploadException:

          public Object onUploadException(Throwable cause)

          { myForm.recordError("Files may not be larger than 1.5 MB. Please choose a smaller file."); return this; }

          ... then the page is completely empty when the user is returned to the page.

          Most (all?) people would treat this as a validation error when the file size is exceeded.

          I'm hoping that we end up with something like this:

          <input t:type="upload" t:id="file" validate="required" maxsize="1500000"/>

          And a default error message similar to the one above would be returned to the user.

          Feasible?

          Show
          Joel Wiegman added a comment - After working with the solution for this bug, it appears to be inconvenient. The uploadException appears to get thrown before the values from the form are bound to the page instance. So if I have the following code to handle the uploadException: public Object onUploadException(Throwable cause) { myForm.recordError("Files may not be larger than 1.5 MB. Please choose a smaller file."); return this; } ... then the page is completely empty when the user is returned to the page. Most (all?) people would treat this as a validation error when the file size is exceeded. I'm hoping that we end up with something like this: <input t:type="upload" t:id="file" validate="required" maxsize="1500000"/> And a default error message similar to the one above would be returned to the user. Feasible?
          Joel Wiegman made changes -
          Resolution Fixed [ 1 ]
          Status Closed [ 6 ] Reopened [ 4 ]
          Hide
          Howard M. Lewis Ship added a comment -

          The change you want would be nice, but is simply not possible. The form data is either available or not; if there's a file upload exception, then none of the data submitted in the form is available to Tapestry. This is a function of the multipart/form encoding type and the underlying Jakarta FileUpload library.

          Show
          Howard M. Lewis Ship added a comment - The change you want would be nice, but is simply not possible. The form data is either available or not; if there's a file upload exception, then none of the data submitted in the form is available to Tapestry. This is a function of the multipart/form encoding type and the underlying Jakarta FileUpload library.
          Howard M. Lewis Ship made changes -
          Resolution Fixed [ 1 ]
          Status Reopened [ 4 ] Closed [ 6 ]
          Jochen Kemnade made changes -
          Link This issue is related to TAP5-2394 [ TAP5-2394 ]
          Transition Time In Source Status Execution Times Last Executer Last Execution Date
          Open Open In Progress In Progress
          21d 8h 44m 1 Howard M. Lewis Ship 29/Oct/08 01:19
          In Progress In Progress Closed Closed
          20h 56m 1 Howard M. Lewis Ship 29/Oct/08 22:15
          Closed Closed Reopened Reopened
          20d 19h 16m 1 Joel Wiegman 19/Nov/08 17:32
          Reopened Reopened Closed Closed
          20m 48s 1 Howard M. Lewis Ship 19/Nov/08 17:53

            People

            • Assignee:
              Howard M. Lewis Ship
              Reporter:
              Joel Wiegman
            • Votes:
              1 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development