处理GroovyPageView时出错:已为此响应调用了getOutputStream()

con*_*ile 5 grails spring grails-2.0

我有一个直接写入输出流的动作.有时我会得到以下错误:

Error processing GroovyPageView: getOutputStream() has already been called for this response
Caused by getOutputStream() has already been called for this response
Run Code Online (Sandbox Code Playgroud)

还有这个:

Executing action [getImage] of controller [buddyis.ItemController] caused exception: Runtime error executing action
Caused by Broken pipe
Run Code Online (Sandbox Code Playgroud)

我该如何解决这些问题?我使用的动作如下所示.

注意:如果这很重要,我使用Tomcat 7.0.42!

def getImage() {
    byte [] imageByteArray = // some image bytes

    response.setHeader 'Content-disposition', "attachment; filename=\"${imageName}${imageExtension}\""
    response.setContentType("image/pjpeg; charset=UTF-8")
    response.contentLength = imageByteArray.size()
    response.outputStream.write(imageByteArray)
    response.outputStream.flush()
    response.outputStream.close()
    return
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*eeh 6

我不知道你为什么会收到这个错误,但是这就是我每次都能做到的.

我不打电话.flush().close()

response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=\"${name}\"")
response.setContentLength(imageByteArray.size())
response.outputStream << imageByteArray
Run Code Online (Sandbox Code Playgroud)

使用上面的工作正常,直到我发现用户可以取消下载,这导致异常.这是我使用的完整代码,而不是response.outputStream << imageByteArray:

    def outputStream = null
    try {
        outputStream = response.outputStream
        outputStream << imageByteArray

    } catch (IOException e){
        log.debug('Canceled download?', e)
    } finally {
        if (outputStream != null){
            try {
                outputStream.close()
            } catch (IOException e) {
                log.debug('Exception on close', e)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)