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

        Activity

        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.
        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?
        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
        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.

          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