2010-04-22 14 views
24

MaxUploadSizeExceededException compare quando si carica un file le cui dimensioni superano il massimo consentito. Voglio mostrare un messaggio di errore quando appare questa eccezione (come un messaggio di errore di convalida). Come posso gestire questa eccezione per fare qualcosa di simile in primavera 3?Come gestire MaxUploadSizeExceededException

Grazie.

+0

Con la cattura l'eccezione in Java e mostrando una pagina di errore? – skaffman

+8

@skaffman Preferirei tornare alla pagina del modulo e mostrare l'errore, ma l'eccezione viene lanciata prima che raggiunga il controller in cui è popolato l'attributo del modello – Javi

+0

Dai un'occhiata a HandlerExceptionResolver: http: // static. springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers –

risposta

31

Alla fine ho trovato una soluzione che funziona con HandlerExceptionResolver.

Aggiungi resolver multipart alla primavera config:

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

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

} 

View - /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> 

Controller - FileUploadController.java: pacchetto 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

Sto lavorando anche su questo problema. Tuttavia, trovo che la richiesta non sia piena di altri parametri, anche se sono nella mia forma. –

+4

Se tutti i controller implementano questo HandlerExceptionResolver, verranno richiamati tutti quando si verificano eccezioni? –

+0

Potresti dirmi, come mostri gli errori sul JSP? – Andrew

6

Grazie per aver risolto questo Steve. Ho bighellonato cercando di risolvere per diverse ore.

La chiave è di avere il controller in esecuzione HandlerExceptionResolver e aggiungere il metodo resolveException.

--Bob

+2

il migliore! stavo per chiudere questa scheda ma poi ho notato questo! Grazie! –

5

consigli Usa regolatore

@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

se si utilizza Ajax, hanno bisogno di JSON risposta, può JSON risposta di metodo 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; 
    }