如何处理MaxUploadSizeExceededException

当我上传大小超过允许的最大值的文件时,会出现MaxUploadSizeExceededExceptionexception。 我想在出现此exception时显示错误消息(如validation错误消息)。 如何在Spring 3中处理此exception以执行此类操作?

谢谢。

我终于想出了一个使用HandlerExceptionResolver工作的解决方案。

将多部分解析器添加到Spring配置

      

Model – UploadedFile.java

 package com.mypkg.models; import org.springframework.web.multipart.commons.CommonsMultipartFile; public class UploadedFile { private String title; private CommonsMultipartFile fileData; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public CommonsMultipartFile getFileData() { return fileData; } public void setFileData(CommonsMultipartFile fileData) { this.fileData = fileData; } } 

查看 – /upload.jsp

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   Test File Upload   

Select a file to upload

${errors}.

Controller – FileUploadController.java:package com.mypkg.controllers;

 import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import com.mypkg.models.UploadedFile; @Controller public class FileUploadController implements HandlerExceptionResolver { @RequestMapping(value = "/upload", method = RequestMethod.GET) public String getUploadForm(Model model) { model.addAttribute("uploadedFile", new UploadedFile()); return "/upload"; } @RequestMapping(value = "/upload", method = RequestMethod.POST) public String create(UploadedFile uploadedFile, BindingResult result) { // Do something with the file System.out.println("######### File Uploaded with Title: " + uploadedFile.getTitle()); System.out.println("######### Creating local file: /var/test-file-upload/" + uploadedFile.getFileData().getOriginalFilename()); try { InputStream in = uploadedFile.getFileData().getInputStream(); FileOutputStream f = new FileOutputStream( "/var/test-file-upload/" + uploadedFile.getFileData().getOriginalFilename()); int ch = 0; while ((ch = in.read()) != -1) { f.write(ch); } f.flush(); f.close(); } catch (IOException e) { e.printStackTrace(); } return "redirect:/"; } /*** Trap Exceptions during the upload and show errors back in view form ***/ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { Map model = new HashMap(); if (exception instanceof MaxUploadSizeExceededException) { model.put("errors", exception.getMessage()); } else { model.put("errors", "Unexpected error: " + exception.getMessage()); } model.put("uploadedFile", new UploadedFile()); return new ModelAndView("/upload", model); } } ======================================================================== 

谢谢你解决这个史蒂夫。 我试图解决几个小时的问题。

关键是让控制器实现HandlerExceptionResolver并添加resolveException方法。

–Bob

使用控制器建议

 @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MaxUploadSizeExceededException.class) public ModelAndView handleMaxUploadException(MaxUploadSizeExceededException e, HttpServletRequest request, HttpServletResponse response){ ModelAndView mav = new ModelAndView(); boolean isJson = request.getRequestURL().toString().contains(".json"); if (isJson) { mav.setView(new MappingJacksonJsonView()); mav.addObject("result", "nok"); } else mav.setViewName("uploadError"); return mav; } } 

如果使用ajax,需要响应json,可以在resolveException方法中响应json

 @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView view = new ModelAndView(); view.setView(new MappingJacksonJsonView()); APIResponseData apiResponseData = new APIResponseData(); if (ex instanceof MaxUploadSizeExceededException) { apiResponseData.markFail("error message"); view.addObject(apiResponseData); return view; } return null; }