exception - Grails - 停止/取消上传时出现异常

标签 exception grails upload multipart

我的 Controller 中有一个非常基本的上传操作。它看起来像下面的 Action 。它工作得很好。我看到的唯一问题是用户取消上传(或在浏览器上点击停止)。我能够正确恢复,但在我的日志中看到未捕获的异常之前无法恢复。下面列出了异常(exception)情况。任何有关如何正确捕获未捕获异常的帮助或反馈将不胜感激。似乎它发生在客户端和 Controller 操作之间的某处,因为正在显示异常但没有显示操作中的任何日志消息。

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

异常(exception)是:
 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 

最佳答案

我在这方面迟到了,但我今天遇到了同样的问题,并通过添加一个 servlet 过滤器解决了它(我也尝试了一个 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 */ }

}

关于exception - Grails - 停止/取消上传时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3441351/

相关文章:

exception - 可恢复异常 : any real-life scenario?

java - 应该如何在架构层面规划异常?

spring - Servlet 和过滤器注册为 Spring Beans 而不是 Grails 中的 web.xml

grails - Grails-呈现模板后如何执行javascript方法?

django - Heroku django项目只读文件系统

asp.net - VB.NET中YouTube DirectUpload的BackgroundWorker?

exception - 懒惰和异常如何在 Haskell 中协同工作?

exception - 如何不在 Logback 中记录特定类型的异常?

Grails 生成的 war 大小小于 55MB

php - 使用jquery上传文件