我希望动态创建一个文件,并在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')
}
});
答案 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中运行良好。 :)谢谢你们!