2012-07-12 165 views
1

我知道这里有几个关于这方面的问题,但这些解决方案都不起作用。Grails下载zip文件(浏览器下载文件)

我试图点击一个div,这反过来jQuery使get请求我的控制器,并最终下载静态文件(Zip)。使用chrome开发工具,我看到请求会以有效的方式返回200.请求的响应似乎是chrome的尝试渲染,但我可以确定zip文件中包含的文件的名称,所以我可以告诉它发现一切正确。

的响应头:

Content-Type:application/zip 
Content-disposition:attachment;filename=myFile.zip 
Date:Thu, 12 Jul 2012 20:18:05 GMT 
Server:Apache-Coyote/1.1 
Transfer-Encoding:chunked 

我的控制器逻辑:

def root = request.getSession().getServletContext().getRealPath("/") 

    def file = new File("C:\path\to\my\file") 

    if (file.exists()) { 
     def os = response.outputStream     
     response.setHeader("Content-Type", "application/zip") 
     response.setHeader("Content-disposition", "attachment;filename=${file.name}") 

     def bytes = file.text.bytes 
     for(b in bytes) { 
      os.write(b) 
     } 

     os.flush() 
          org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes().renderView = false 
    } 

我不知道为什么我的浏览器是不实际下载文件。我已经尝试了很多不同的控制器逻辑变体,但都具有相同的结果。

有些事情我已经试过:

  • 内容类型为“应用程序/八位字节流;”
  • response.outputStream << file.bytes
  • response.outputStream << file.newInputStream()
  • 我添加的内容长度
  • 流之后移动内容类型写入

我使用Grails 2.0.4

+0

如果我正确理解你,你正试图从ajax请求下载文件。这并不真正起作用。 JavaScript并不是真正用于处理这种二进制数据的。是这样吗? – Gregg 2012-07-12 20:48:06

+0

希望javascript不需要对二进制文件进行任何操作。JavaScript应该只是简单地提出一个Web请求 – OnResolve 2012-07-12 21:13:54

+1

不,这不是它的工作原理。您无法通过Ajax请求下载文件。 – Gregg 2012-07-12 21:15:54

回答

4

格雷格的评论是正确的,但有变通办法,这里是我如何工作:

抓住jQuery AJAX file download plugin(希望你使用jQuery;))

我见过的alternative但没有尝试过

这确实基于动态生成的形式和张贴的控制器,而HTTP请求(不阿贾克斯)仍然为您提供AJAX体验。如果这看起来有点笨重,那是,但它是我发现这个工作的唯一方式。以上网址对潜在问题进行了讨论。 在jQuery的调用,如插件:

$("#myDiv").click(function() { 
    $.download('${createLink(controller: 'download', action: 'zipFile')}', 'fileName=' + $("#myTextBox").val()); 
}); 

你的控制器看起来接近,使用的是什么,你已经尝试应该工作:

response.setHeader("Content-Type", "application/zip") 
response.setHeader("Content-disposition", "attachment;filename=${file.name}") 
response.outputStream << file.newInputStream() 
我一直在使用这一段时间

现在没有任何问题(尚)

+0

我试过你的jQuery语法,但它不起作用。请帮帮我 – VVB 2015-02-18 09:36:18