使用Spring 3 @ExceptionHandler和commons FileUpload和SizeLimitExceededException/MaxUploadSizeExceededException

Luk*_*uke 18 exception-handling file-upload spring-mvc apache-commons-fileupload

在上传大文件时,我无法捕捉并优雅地处理commons fileupload FileUploadBase.SizeLimitExceededException或spring MaxUploadSizeExceededException.

据我所知,这些异常在数据绑定期间抛出,在实际到达控制器之前,因此导致500并且不调用异常处理程序方法.有没有人遇到过这个,以及正确处理这些异常的最佳方法是什么?

the*_*man 7

多亏了这个简单的解决方案.我扩展了一下.我想保持文件处理不变,并将Exception传输到Controller.

package myCompany; 

public class DropOversizeFilesMultipartResolver extends CommonsMultipartResolver {

    /**
     * Parse the given servlet request, resolving its multipart elements.
     * 
     * Thanks Alexander Semenov @ http://forum.springsource.org/showthread.php?62586
     * 
     * @param request
     *            the request to parse
     * @return the parsing result
     */
    @Override
    protected MultipartParsingResult parseRequest(final HttpServletRequest request) {

        String encoding = determineEncoding(request);
        FileUpload fileUpload = prepareFileUpload(encoding);

        List fileItems;

        try {
            fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
        } catch (FileUploadBase.SizeLimitExceededException ex) {
            request.setAttribute(EXCEPTION_KEY, ex);
            fileItems = Collections.EMPTY_LIST;
        } catch (FileUploadException ex) {
            throw new MultipartException("Could not parse multipart servlet request", ex);
        }

        return parseFileItems(fileItems, encoding);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在控制器中

  @InitBinder("fileForm")
  protected void initBinderDesignForm(WebDataBinder binder) {
    binder.setValidator(new FileFormValidator());
  }

    @RequestMapping(value = "/my/mapping", method = RequestMethod.POST)
  public ModelAndView acceptFile(HttpServletRequest request, Model model, FormData formData,
      BindingResult result) {

    Object exception = request.getAttribute(DropOversizeFilesMultipartResolver.EXCEPTION_KEY);
    if (exception != null && FileUploadBase.SizeLimitExceededException.class.equals(exception.getClass())) {
      result.rejectValue("file", "<your.message.key>");
      LOGGER.error(exception);
    }
Run Code Online (Sandbox Code Playgroud)

spring配置保持不变.将异常传输到验证器真的很好,但我还没弄清楚如何做到这一点.

  • 如果其中一个请求参数是csrf令牌,则@Markus的注释特别重要.设置`fileItems = Collections.EMPTY_LIST;`丢弃CSRF令牌,导致CSRF过滤器将此请求视为无效. (2认同)