2010-08-09 10 views
5

Ho un'azione di caricamento molto semplice nel mio controller. Sembra qualcosa di simile all'azione sottostante. Funziona alla grande. L'unico problema che sto vedendo è quando un utente cancella un caricamento (o interrompe la ricerca sul proprio browser). Sono in grado di recuperare correttamente, ma non prima di vedere un'eccezione non rilevata nei miei registri. L'eccezione è elencata di seguito. Qualsiasi aiuto o feedback su come rilevare correttamente l'eccezione non rilevata qui sarebbe apprezzato. Sembra che stia accadendo da qualche parte tra il client e l'azione del controller dal momento che viene visualizzata l'eccezione, ma nessuno dei messaggi di registro nell'azione viene visualizzato.Grails - Eccezione durante l'interruzione/cancellazione di un caricamento

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

eccezione è:

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 

risposta

2

Sono terribilmente in ritardo su questo, ma ho appena incontrato lo stesso problema di oggi e risolto con l'aggiunta di un filtro servlet (ho provato anche un filtro Grails, ma l'eccezione viene lanciata prima di colpirla).

In primo luogo è necessario creare un web.xml nel progetto ...

grails install-templates

Aggiungere un filtro per web.xml (fare attenzione a non mettere il filtro-mapping prima di qualsiasi altro 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> 

creare la classe del 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 */ } 

}

Problemi correlati