2

キャンセルされたファイルのダウンロードを適切に処理する方法は? 問題のファイルはビルドに時間がかかるかなり大きな zip ファイルであるため、ユーザーはダウンロード ダイアログ ウィンドウの [キャンセル] ボタンを押す十分な時間があります。

これが発生すると、厄介な例外が発生します (以下を参照)。これは、クライアントがパイプを切断したためです。しかし、それをきれいにする方法は?Tomcatのログに散らばらないように例外をキャッチする適切な方法はどこですか?

ありがとうございました。

ダウンロード コード自体は、教科書の非常に標準的なコードです。

import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream

def getZipFile(params) {   
  response.setHeader("Expires", "0");
  response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
  response.setHeader("Pragma", "public");
  response.setHeader("Content-Disposition", "attachment; filename=\"filename.zip\"");
  response.contentType = "application/zip"

  def zos = new ZipOutputStream(response.outputStream)
  zos = functionThatCreatesTheZipFile(zos, params) // this takes some time
  zos.close()
}

例外:

rfpmgr [2013-05-01 10:14:32.337] ERROR: web.errors.GrailsExceptionResolver IOException occurred when processing request: [GET] /rfpManager/report/downloadZipFile
Stacktrace follows:
java.io.IOException
at java.util.zip.ZipOutputStream.writeBytes(ZipOutputStream.java:617)
at java.util.zip.ZipOutputStream.writeCEN(ZipOutputStream.java:501)
at java.util.zip.ZipOutputStream.finish(ZipOutputStream.java:348)
at java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:238)
at java.util.zip.ZipOutputStream.close(ZipOutputStream.java:360)
at gov.usgs.eventManager.ZipService.getZipFile(ZipService.groovy:32)
at gov.usgs.eventManager.ReportController$_closure18.doCall(ReportController.groovy:738)
at gov.usgs.jdt.josso.spring.JOSSOProcessingFilter.doFilter(JOSSOProcessingFilter.java:144)
at gov.usgs.jdt.josso.agent.GenericServletSSOAgentFilter.doFilter(GenericServletSSOAgentFilter.java:431)
at java.lang.Thread.run(Thread.java:722)
rfpmgr [2013-05-01 10:14:32.354] ERROR: web.errors.GrailsExceptionResolver IllegalStateException occurred when processing request: [GET] /rfpManager/report/downloadZipFile
getOutputStream() has already been called for this response. Stacktrace follows:
org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: getOutputStream() has already been called for this response
at gov.usgs.jdt.josso.spring.JOSSOProcessingFilter.doFilter(JOSSOProcessingFilter.java:144)
at gov.usgs.jdt.josso.agent.GenericServletSSOAgentFilter.doFilter(GenericServletSSOAgentFilter.java:431)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
at gsp_rfpManager_errorserrors_gsp.run(gsp_rfpManager_errorserrors_gsp.groovy:17)
... 3 more
4

2 に答える 2

2

これはうまくいくようです:

import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
import org.apache.catalina.connector.ClientAbortException

def getZipFile(params) {   
  response.setHeader("Expires", "0");
  response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
  response.setHeader("Pragma", "public");
  response.setHeader("Content-Disposition", "attachment; filename=\"filename.zip\"");
  response.contentType = "application/zip"

  try {
    def zos = new ZipOutputStream(response.outputStream)
    zos = functionThatCreatesTheZipFile(zos, params) // this takes some time
    zos.close()
  }
  catch (ClientAbortException ex) {
    println "user aborted download"
  }
}
于 2013-05-01T18:27:39.623 に答える