Grails下载zip文件(浏览器下载文件)

Grails下载zip文件(浏览器下载文件),grails,download,Grails,Download,我知道在这方面已经有一些问题了,但这些解决方案都不起作用 我试图单击一个div,jQuery会向我的控件发出get请求,最后下载静态文件(Zip)。使用chrome开发工具,我看到请求作为一个有效的200返回。请求的响应似乎是chrome试图进行的渲染,但我可以分辨出zip文件中包含的文件名,这样我就可以判断它是否发现所有内容都是正确的 响应标题为: Content-Type:application/zip Content-disposition:attachment;filename=myFi

我知道在这方面已经有一些问题了,但这些解决方案都不起作用

我试图单击一个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.outputStreamGregg的评论是正确的,但是有一些解决方法,下面是我如何让它工作的:

    抓取(希望您使用的是jquery;)

    我看过一本书,但没试过

    这是一个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()
    
    response.setHeader(“内容类型”、“应用程序/zip”)
    setHeader(“内容处置”、“附件;文件名=${file.name}”)
    
    response.outputStreamGregg的评论是正确的,但是有一些变通方法,下面是我如何让它工作的:

    抓取(希望您使用的是jquery;)

    我看过一本书,但没试过

    这是一个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()
    
    response.setHeader(“内容类型”、“应用程序/zip”)
    setHeader(“内容处置”、“附件;文件名=${file.name}”)
    
    response.outputStream在设置标题中的内容配置时,需要记住以下几点,因为Chrome对格式要求非常严格,如果设置错误,可能会出现“重复标题”错误:

    当设置标题中的内容配置时,需要记住以下几点,因为Chrome对格式要求非常严格,如果设置错误,可能会出现“重复标题”错误:

    如果我理解正确,您正在尝试从ajax请求下载文件。那是行不通的。JavaScript并不是专门用来处理那样的二进制数据的。是这样吗?希望javascript不需要对二进制文件做任何事情。javascript应该只是生成一个web请求no,它不是这样工作的。您不能通过Ajax请求下载文件。@Gregg虽然我不知道为什么,但看起来您是正确的。我从未想过我是否提出了ajax请求与这个问题有任何关系。回答一下,我就接受。干得好。如果我理解正确,您正在尝试从ajax请求下载文件。那是行不通的。JavaScript并不是专门用来处理那样的二进制数据的。是这样吗?希望javascript不需要对二进制文件做任何事情。javascript应该只是生成一个web请求no,它不是这样工作的。您不能通过Ajax请求下载文件。@Gregg虽然我不知道为什么,但看起来您是正确的。我从未想过我是否提出了ajax请求与这个问题有任何关系。回答一下,我就接受。干得好。我试过你的jQuery语法,但不起作用。请帮助meI尝试您的jQuery语法,但它不起作用。请帮帮我