grails应用程序中的文件下载功能

时间:2016-07-19 00:07:27

标签: grails

我希望动态创建一个文件,并在GRAILS应用程序中为用户提供下载链接。 我按照here的方法进行了操作。我没有错误,但它似乎没有工作。这是我的控制器代码。

`render(file:pptFile,fileName:' someppt.pptx',contentType:' application / octet-stream')

客户端代码进行AJAX调用以从服务器检索文件。它不会导致服务器强制在客户端(浏览器)上下载文件。这是客户端代码。

$.ajax({
type : 'POST',
url : '<<URL>>',
success: function(result) {
var uri = 'data:application/octet-stream;charset=UTF-8,' +   
encodeURIComponent(result);
window.open(uri, 'somePPT.pptx');
},
failure: function(){
alert ('failure')
}
});

3 个答案:

答案 0 :(得分:2)

也许类似于此(释义,但用于下载json文件):

def someControllerMethod() {
    def dlContent = someService.marshalJson()
    def contentType = "application/octet-stream"
    def filename = "someFilename.json"
    response.setHeader("Content-Disposition", "attachment;filename=${filename}")
    render(contentType: contentType, text: dlContent as JSON)
}

答案 1 :(得分:0)

我喜欢使用@railsdog中的render方法的解决方案!

到目前为止我使用的另一种方法是:

def controllerMethod() {
    ...
    File file = sepaXmlService.createTransfersFile(...)

    response.setContentType("application/xml")
    response.setHeader("Content-disposition", "attachment;filename=${file.getName()}")

    OutputStream out = response.getOutputStream()
    out.write(file.bytes)
    out.close()
    file.delete()
    return
    ...
}

在视图中,我在表单中使用以下语句:

<g:actionSubmit action="controllerMethod" class="btn" value="Get XML!" /></td>

我认为也应该可以使用

<g:link controller="foobar" action="controllerMethod" class="btn">GetXML</g:link>

答案 2 :(得分:0)

好。所以我终于开始工作了。正如@railsdog和其他许多人所提出的那样(这个问题已在stackoverflow中的其他线程上讨论过,但我遇到的具体情况略有不同)我最终直接从服务器写入响应并取出了AJAX调用。我进行AJAX调用的唯一原因是因为我不想提交具有“生成文件”功能的当前页面(页面上有很多数据元素,我不想重新执行整个页面用于下载文件)。所以我最终使用了一个目标为“_blank”的锚标签。这是代码段

<a href="myControllerMethodToGenerateFileAndWriteToHTTPResponseDirectlyAsSuggestedByOthersInThisPost" 
target="_blank"/>

这实际上打开了一个新页面并完成了提交以启动下载。问题解决了。它在CHROME中运行良好。 :)谢谢你们!