2010-08-09 17 views
5

Tengo una acción de carga muy básica en mi controlador. Se ve algo así como la acción a continuación. Funciona muy bien. El único problema que estoy viendo es cuando un usuario cancela una carga (o hits detiene en su navegador). Puedo recuperarme correctamente, pero no antes de ver una excepción no detectada en mis registros. La excepción se enumera a continuación. Cualquier ayuda o comentario sobre cómo atrapar correctamente la excepción no detectada aquí sería apreciada. Parece que está sucediendo en algún lugar entre el cliente y la acción del controlador, ya que se muestra la excepción, pero no se muestran ninguno de los mensajes de registro en la acción.Grails - Excepción al detener/cancelar una carga

def upload = { 
    def f = null 
    try { 
     f = request.getFile('assetFile') 
     if(!f || f.empty) { 
      log.warn "File is empty" 
      render(view:'upload') 
      return 
     } 
    } catch (Exception e) { 
     log.warn "Caught exception:", e 
     render(view:'upload') 
     return 
    } 
} 

Excepción es:

2010-08-06 15:33:22,826 ERROR [TP-Processor8] filter.UrlMappingsFilter - Error when matching URL mapping [/(*)/(*)?/(*)?]:Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly 
    org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly 
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
      at org.jsecurity.web.servlet.JSecurityFilter.doFilterInternal(JSecurityFilter.java:384) 
      at org.jsecurity.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:183) 
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
      at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) 
      at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
      at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775) 
      at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704) 
      at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897) 
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
      at java.lang.Thread.run(Thread.java:619) 
    Caused by: org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly 
      at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367) 
      at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
      ... 25 more 
    Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly 
      at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983) 
      at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887) 
      at java.io.InputStream.read(InputStream.java:85) 
      at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94) 
      at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64) 
      at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362) 
      ... 26 more 

Respuesta

2

Estoy terriblemente a última hora del este, pero me acabo de encontrar con el mismo problema hoy y resuelto mediante la adición de un filtro de servlet (también probé un filtro Grails, pero la excepción se arroja antes de golpearla).

primer lugar usted necesita para crear un web.xml en su proyecto ...

grails install-templates

Añadir un filtro a web.xml (asegúrese de no poner el filtro de mapeo antes de cualquier otro filtro) ...

<filter> 
    <filter-name>upload</filter-name> 
    <filter-class>com.myProject.UploadFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>upload</filter-name> 
    <url-pattern>/media/uploadMediaAsset/*</url-pattern> 
</filter-mapping> 

crear la clase de filtro ...

package com.myProject 

import javax.servlet.* 

import org.apache.commons.logging.Log 
import org.apache.commons.logging.LogFactory 

import org.springframework.web.multipart.MultipartException 

public class UploadFilter implements Filter { 

private Log log = LogFactory.getLog(getClass()) 

public void init(FilterConfig filterConfig) throws ServletException { /* Do nothing */ } 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { 

    log.debug 'Making sure file upload gets here.' 

    try { 
     chain.doFilter(request, response) 
    } catch (MultipartException mpE) { 
     log.error mpE 
    } 
} 

public void destroy() { /* Do nothing */ } 

}

Cuestiones relacionadas