我知道有关SO的问题已经有几个问题,但这些解决方案都没有。
我正在尝试点击一个div,然后jQuery向我的控制器发出get
请求,最后下载静态文件(Zip)。使用chrome dev工具,我看到请求将作为有效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 :(得分:4)
Gregg的评论是正确的,但有一些解决方法,以下是我的工作方式:
抓住jQuery AJAX file download plugin(希望你使用jquery;))
我见过alternative但未尝试过
这是一个HTTP请求(不是Ajax),它基于动态构建表单并将其发布到控制器,同时仍然为您提供您所追求的AJAX体验。如果这看起来有点笨重,那就是,但它是我发现这个工作的唯一方法。上面的URL讨论了潜在的问题。 在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()
我已经使用了一段时间而没有任何问题(还)
答案 1 :(得分:1)
在标题中设置内容处置时,值得记住以下内容,因为Chrome对格式非常严格,如果你弄错了,你可能会收到“重复标题”错误: http://www.intelligrape.com/blog/2012/04/11/duplicate-headers-received-from-server-fix-for-chrome/