2013-08-06 7 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 

と、この1:

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 '完了などで始めることもできます。 – 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 

を呼び出すことはありません。

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 "アプリケーション/オクテットストリーム"ですか? – confile

+0

私は7.0.39を使用していると思いますので、それは問題ではありません。限りコンテンツの種類 - 私は複数の種類のファイルのダウンロード/アップロードを許可します。これはすべての人にとってうまくいくようです。 –

+0

さて、.flush()と.close()はどうして必要なのですか? – confile

0

私が実行しているGrailsのTomcatで2.5ながら、この問題を持っていた:7.0.55.3およびJavaメロディGrailsのプラグインをインストールしてこれは私がresponse.outputStream << imageByteArrayの代わりに使用する完全なコードです。 Javaメロディーをアンインストールした後、正常に動作しました。

関連する問題