【问题标题】:File download feature in grails applicationGrails 应用程序中的文件下载功能
【发布时间】:2016-07-22 00:15:23
【问题描述】:

我希望动态创建一个文件,并在 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')
}
});

【问题讨论】:

    标签: grails


    【解决方案1】:

    可能类似于此(意译,但用于下载 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)
    }
    

    【讨论】:

    • 您能否添加一些有关如何将文件转换为 JSON 的详细信息?我正在生成一个 PPTX 及其 java.io.File。此外,我正在对服务器进行 AJAX 调用以动态生成文件,并且我想将该文件提供给客户端以供下载。我需要强制浏览器打开下载提示。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我喜欢使用来自@railsdog 的渲染方法的解决方案!

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

      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>
      

      【讨论】:

      • 我尝试了你的建议和@railsdog 的建议。我仍然无法让浏览器提示下载。我注意到我没有添加客户端代码。我现在也添加了客户端代码。我错过了什么?
      猜你喜欢
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多