2010-08-09 2 views
5

У меня есть очень базовое действие загрузки в моем контроллере. Это похоже на действие ниже. Он отлично работает. Единственная проблема, которую я вижу, - это когда пользователь отменяет загрузку (или останавливает остановку в своем браузере). Я могу восстановить корректно, но не до того, как увижу в моих журналах одностороннее исключение. Исключение указано ниже. Любая помощь или отзывы о том, как правильно поймать неперехваченное исключение здесь, будут оценены. Похоже, что это происходит где-то между клиентом и действием контроллера, поскольку отображается исключение, но ни одно из сообщений журнала в действии не появляется.Grails - Исключение при остановке/отмене загрузки

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

Исключение:

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 

ответ

2

Я ужасно поздно, но я только что столкнулся с той же проблемой сегодня и решить ее путем добавления сервлета фильтра (я также попробовал фильтр Grails, но исключение бросается до удара).

Прежде всего, необходимо создать web.xml в вашем проекте ...

grails install-templates

Добавить фильтр web.xml (убедитесь, что не ставить фильтр-отображение перед любыми другими фильтрами) ...

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

Создать класс фильтра ...

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

}

Смежные вопросы