2013-08-06 7 views
5

Ich habe eine Aktion, die direkt in den Ausgabestream schreibt. Manchmal habe ich folgenden Fehler:Fehler bei der Verarbeitung von GroovyPageView: getOutputStream() wurde bereits für diese Antwort aufgerufen

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

und diese ein:

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

Wie kann ich diese Probleme zu lösen? Die Aktion, die ich verwende, ist unten aufgeführt.

HINWEIS: Ich verwende Tomcat 7.0.42, wenn dies wichtig ist!

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

Versuchen Sie, etwas (Dummy) zu indizieren oder einen Statuscode rendern und sehen, ob Sie immer noch das Problem bekommen. Sie können mit 'render (status: 200) 'oder zumindest' render "Done" etc vor der Rückkehr beginnen. – dmahapatro

+0

Warum das tun? – confile

+0

Verweisen Sie [diese Frage] (http://stackoverflow.com/questions/13184603/grails-error-using-httpservletresponse-to-export-file-for-download). – dmahapatro

Antwort

6

Ich weiß nicht, warum Sie diese Fehlermeldung erhalten, ist aber hier, was ich tun, dass jedes Mal funktioniert.

rufe ich nicht .flush() oder .close()

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

die Verwendung von oben es gut funktioniert, bis ich einen Benutzer herausgefunden, kann einen Download abzubrechen, die eine Ausnahme verursacht. Dies ist der vollständige Code, den ich statt response.outputStream << imageByteArray verwenden:

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) 
      } 
     } 
    } 
+0

Ich benutze Tomcat 7.0.42, wenn dies für die Antwort wichtig ist? Warum ContentType "application/octet-stream"? – confile

+0

Ich denke, ich benutze 7.0.39, so dass es egal sein sollte. Soweit der Inhaltstyp - ich erlaube den Download/Upload von mehreren Arten von Dateien. Dies scheint für alle zu funktionieren. –

+0

Okay und was ist mit .flush() und .close() warum brauchst du das nicht? – confile

0

ich dieses Problem hatte während des Laufens Grails 2.5 auf tomcat: 7.0.55.3 und mit der Java-Melodie Grails Plugin installiert sein. Nach der Deinstallation von Java-Melodie funktionierte es gut