MaxUploadSizeExceededException異常


Spring中向服務器上傳圖片需要進行配置bean CommonsMultipartResolver;具體配置如下:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默認編碼 (ISO-8859-1) --> <property name="defaultEncoding" value="UTF-8"/> <!-- 最大內存大小 (10240) --> <property name="maxInMemorySize" value="10240"/> <!-- 上傳后的目錄名 --> <!--<property name="uploadTempDir" value="/upload"/>--> <!-- 最大文件大小,-1為無限止(-1),最大上傳文件3M --> <property name="maxUploadSize" value="3000000"/> </bean>

上面的配置中可以看到設置的文件上傳的大小限制為3M;當上傳的文件的大小超過上限時,便會拋出MaxUploadSizeExceededException異常。

今天遇到的最大的問題便是:如何優雅的處理MaxUploadSizeExceededException異常?

MaxUploadSizeExceededException異常的特殊之處在於,當上傳文件的大小超過限制時,它的拋出並是在進入Controller之前,所以不能在controller中利用注解@ExceptionHandler(MaxUploadSizeExceededException.class)來定義該異常的處理方法;

經過網上的搜索,出了利用filter以為,還看到其它三種處理辦法:

1.在xml中配置SimpleMappingExceptionResolver,其中加入對MaxUploadSizeExceededException異常的處理,指定對應的錯誤頁面,具體如下:

<!-- 全局異常處理 -->
    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 處理超過大小時的異常 --> <!--遇到MaxUploadSizeExceededException異常時,自動跳轉到/WEB-INF/views/errors/upload.jsp頁面 --> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">errors/upload</prop> </props> </property> </bean>

2.將對應的controller實現HandlerExceptionResolver接口,然后重寫其中的resolveException方法,返回ModelAndView,用於對MaxUploadSizeExceededException進行處理,具體如下:

@Controller
public class FileUploadController  implements HandlerExceptionResolver { /*** Trap Exceptions during the upload and show errors back in view form ***/ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { Map<String, Object> model = new HashMap<String, Object>(); 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); } }

3.繼承CommonsMultipartResolver類,重寫parseRequest方法,在其中對MaxUploadSizeExceededException異常信息進行處理,放入request中,在controller再進行相應ModelAndView的返回,具體如下:

public class DropOversizeFilesMultipartResolver extends CommonsMultipartResolver { @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); } }

 

controller
@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); }

以上三種方法都能夠類似實現返回一個ModelAndView來實現對MaxUploadSizeExceededException進行處理;


http://stackoverflow.com/questions/2689989/how-to-handle-maxuploadsizeexceededexception

http://stackoverflow.com/questions/4029583/using-spring-3-exceptionhandler-with-commons-fileupload-and-sizelimitexceededex

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM