用户在Grails中取消了文件下载 [英] User cancelled file download in Grails

查看:69
本文介绍了用户在Grails中取消了文件下载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何正确处理已取消的文件下载?有问题的文件是一个非常大的zip文件,需要很长时间才能生成,因此用户有足够的时间在他的下载对话框窗口中点击取消按钮。



发生这种情况时,会发生一个令人讨厌的异常(请参见下文),因为客户端破坏了管道。但如何清理它?



谢谢。


$ b $在哪里/有什么正确的方法来捕捉异常,以便tomcat日志不会被他们遗弃?下载代码本身就是教科书中非常标准的代码:

  import java.util.zip.ZipEntry 
import java.util.zip.ZipOutputStream
$ b $ 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)//这需要一些时间
zos.close()
}

例外:

  rfpmgr [2013-05-01 10:14:32.337]错误:web.errors.GrailsExceptionResolver处理请求时发生IOException:[GET] / rfpManager / report / downloadZipFile 
Stacktrace如下:
java.io.IOException $ b $ java.util.zip.ZipOutputStream.writeBytes(ZipOutputStream.java:617)$ b $ 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 $ _closu re18.doCall(ReportController.groovy:738)
at gov.usgs.jdt.jos.spring.JOSSOProcessingFilter.doFilter(JOSSOProcessingFilter.java:144)
at gov.usgs.jdt.josso.agent。 GenericServletSSOAgentFilter.doFilter(GenericServletSSOAgentFilter.java:431)$ b $在java.lang.Thread.run(Thread.java:722)
rfpmgr [2013-05-01 10:14:32.354]错误:web。 errors.GrailsExceptionResolver处理请求时发生IllegalStateException:[GET] / rfpManager / report / downloadZipFile
getOutputStream()已被调用以用于此响应。 Stacktrace如下:
org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException:处理GroovyPageView时出错:getOutputStream()已经在gov.usgs.jdt.jos中为此响应
调用。 spring.JOSSOProcessingFilter.doFilter(JOSSOProcessingFilter.java:144)
at gov.usgs.jdt.jos.gent.GenericServletSSOAgentFilter.doFilter(GenericServletSSOAgentFilter.java:431)
at java.lang.Thread.run( Thread.java:722)
导致:java.lang.IllegalStateException:getOutputStream()已被调用此响应
在gsp_rfpManager_errorserrors_gsp.run(gsp_rfpManager_errorserrors_gsp.groovy:17)
.. 。3 more


解决方案

这似乎工作得很好:

  import java.util.zip.ZipEntry 
import java.util.zip.ZipOutputStream
导入组织。 apache.catalina.connector.ClientAbortException
$ b $ 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)/ /这需要一些时间
zos.close()
}
catch(ClientAbortException ex){
printlnuser aborted download
}
}


How to properly handle a cancelled file download? The file in question is a pretty large zip file that takes a long time to build, so the user has plenty of time to hit the Cancel button on his download dialog window.

When it happens, a nasty Exception occurs (see below), which is expected, since the client broke the pipe. But how to clean it up? Where/What's the proper way to catch the Exception so that the tomcat logs are not littered with them?

Thank you.

The download code itself is pretty standard code from the textbook:

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()
}

Exception:

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

解决方案

This seems to work just fine:

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"
  }
}

这篇关于用户在Grails中取消了文件下载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆