multipartresolver maxuploadsize maximum exceeded java spring forms file-upload spring-mvc

java - maximum - Cómo manejar MaxUploadSizeExceededException



multipartresolver maxuploadsize (4)

Finalmente descubrí una solución que funciona con HandlerExceptionResolver.

Agregue resolución de varias partes a su configuración Spring :

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- the maximum size of an uploaded file in bytes --> <!-- <property name="maxUploadSize" value="10000000"/> --> <property name="maxUploadSize" value="1000"/> </bean>

Modelo - 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; } }

Ver - /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" %> <html> <head> <title>Test File Upload</title> </head> <body> <h1>Select a file to upload</h1> <c:if test="${not empty errors}"> <h2 style="color:red;">${errors}.</h2> </c:if> <form:form modelAttribute="uploadedFile" method="post" enctype="multipart/form-data" name="uploadedFileform" id="uploadedFileform"> <table width="600" border="0" align="left" cellpadding="0" cellspacing="0" id="pdf_upload_form"> <tr> <td width="180"><label class="title">Title:</label></td> <td width="420"><form:input id="title" path="title" cssClass="areaInput" size="30" maxlength="128"/></td> </tr> <tr> <td width="180"><label class="title">File:</label></td> <td width="420"><form:input id="fileData" path="fileData" type="file" /></td> </tr> <tr> <td width="180"></td> <td width="420"><input type="submit" value="Upload File" /></td> </tr> </table> </form:form> </body> </html>

Controlador - FileUploadController.java : paquete 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<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); } } ========================================================================

MaxUploadSizeExceededException excepción MaxUploadSizeExceededException aparece cuando MaxUploadSizeExceededException un archivo cuyo tamaño supera el máximo permitido. Quiero mostrar un mensaje de error cuando aparece esta excepción (como un mensaje de error de validación). ¿Cómo puedo manejar esta excepción para hacer algo como esto en la primavera 3?

Gracias.


Gracias por resolver esto Steve. Golpeé tratando de resolver durante varias horas.

La clave es hacer que el controlador implemente HandlerExceptionResolver y agregue el método resolveException .

--Chelín


Use el consejo del controlador

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


si usa ajax, necesita respuesta json, puede responder a json en el método resolveException

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