5

出力ストリームに直接書き込むアクションがあります。時々、次のようなエラーが発生します。

Error processing GroovyPageView: getOutputStream() has already been called for this response
Caused by getOutputStream() has already been called for this response

そしてこれ:

Executing action [getImage] of controller [buddyis.ItemController] caused exception: Runtime error executing action
Caused by Broken pipe

これらの問題を解決するにはどうすればよいですか? 私が使用するアクションを以下に示します。

注: これが重要な場合は、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
}
4

2 に答える 2

7

なぜそのエラーが発生するのかわかりませんが、ここで私がやっていることは毎回うまくいきます。

.flush()電話もしないし.close()

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

上記を使用すると、ユーザーがダウンロードをキャンセルできることがわかり、例外が発生するまで、正常に機能していました。これは、代わりに使用する完全なコードです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)
            }
        }
    }
于 2013-08-06T20:02:30.543 に答える
0

tomcat:7.0.55.3 で grails 2.5 を実行し、java-melody grails プラグインがインストールされているときに、この問題が発生しました。java-melody をアンインストールした後、問題なく動作しました

于 2016-04-09T18:16:00.687 に答える