2010-04-22 10 views
24

MaxUploadSizeExceededException excepción aparece cuando cargo 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?Cómo manejar MaxUploadSizeExceededException

Gracias.

+0

Al detectar la excepción en Java y mostrando una página de error? – skaffman

+8

@skaffman Prefiero volver a la página de formulario y mostrar el error, pero la excepción se produce antes de que llegue al controlador donde se rellena el atributo del modelo – Javi

+0

Eche un vistazo al HandlerExceptionResolver: http: // static. springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers –

Respuesta

31

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

Añadir resolución de varias partes de su configuración primavera:

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

} 

Vista - /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); 
    } 

} 

======================================================================== 
+1

Estoy trabajando en este tema también. Sin embargo, me parece que la solicitud no está llena de otros parámetros, aunque estén en mi forma. –

+4

Si todos los controladores implementan este HandlerExceptionResolver, ¿se llamarán todos cuando se produzcan excepciones? –

+0

¿Podría decirme, cómo muestra los errores en el JSP? – Andrew

6

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.

--Bob

+2

¡lo mejor! ¡Estaba a punto de cerrar esta pestaña, pero luego descubrí esto! ¡Gracias! –

5

consejos Uso 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; 
    } 
} 
1

si el uso de AJAX, JSON necesitan respuesta, puede JSON respuesta 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; 
    }