2013-08-06 45 views
5

我有一個直接寫入輸出流的操作。有時候,我得到以下錯誤:錯誤處理GroovyPageView:getOutputStream()已被調用此響應

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

嘗試呈現的東西(假),以指數或呈現狀態代碼,看看你仍然可以得到這個問題。在返回之前,你可以從'render(status:200)'或者至少'render'Done''開始。 – dmahapatro

+0

爲什麼要這樣做? – confile

+0

請參閱[此問題](http://stackoverflow.com/questions/13184603/grails-error-using-httpservletresponse-to-export-file-for-download)。 – dmahapatro

回答

6

我不知道你爲什麼得到那個錯誤,但是這裏是我每次都在做的事情。

我不叫.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) 
      } 
     } 
    } 
+0

我使用Tomcat 7.0.42,如果這對於答案很重要?爲什麼ContentType「application/octet-stream」? – confile

+0

我想我正在使用7.0.39,所以應該沒關係。至於內容類型 - 我允許下載/上傳多種類型的文件。這似乎適用於所有人。 –

+0

好的,.flush()和.close()怎麼樣?你爲什麼不需要它? – confile

0

我有這個問題,同時運行的Grails 2.5在Tomcat:7.0.55.3,並與Java的旋律Grails的插件安裝。卸載Java旋律之後,它的工作只是罰款

相關問題