2010-08-09 17 views
5

Denetleyicimde çok basit bir yükleme eylemim var. Aşağıdaki eylem gibi bir şey görünüyor. Harika çalışıyor. Gördüğüm tek sorun, bir kullanıcı bir yüklemeyi iptal ettiğinde (veya tarayıcısını durdurduklarında). Doğru şekilde kurtarabilirim, ancak günlüklerimde yakalanmamış bir istisna görmeden önce. İstisna aşağıda listelenmiştir. Buradaki yakalanmamış istisnanın nasıl doğru bir şekilde yakalanacağına dair herhangi bir yardım veya geri bildirim takdir edilecektir. İstemci ve denetleyici eylemi arasında, istisna görüntülendiğinden beri bir yerde oluyor gibi görünüyor, ancak eylemdeki günlük iletilerinin hiçbiri gösterilmiyor.Grails - Bir yükleme dururken/iptal ederken istisna

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

İstisna ise:

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 

cevap

2

Bu konuda korkunç geciktim, ama sadece bugün aynı sorunla karşılaştık ve bir servlet filtre ekleyerek bunu çözüldü (Ben de, bir Grails filtresi çalıştı ancak istisna, vurulmadan önce atılır).

Önce

grails install-templates

(başka filtreler önce filtre-eşleme koymak emin olun) web.xml''deki için bir filtre ekleyin ... projenizde bir web.xml oluşturmanız gerekir ...

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

... filtre sınıf oluşturun

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