【问题标题】:Download CSV to browser in Grails 4.2.2在 Grails 4.2.2 中将 CSV 下载到浏览器
【发布时间】:2014-12-09 10:06:24
【问题描述】:

一段时间以来,我一直在尝试将 CSV 文件下载到 grails 中的浏览器,但没有成功。我有以字节为单位的数据,并且没有运气使用以下代码......我尝试了几个选项,如渲染,但似乎没有什么对我有用。有什么建议吗?

response.contentType='text/csv';
            response.setHeader("Content-Transfer-Encoding", "binary");
            response.setHeader("Cache-Control", "no-cache, must-revalidate");
            response.setHeader("Pragma", "no-cache");
            response.setCharacterEncoding("UTF-8")
            response.outputStream << data.bytes
            response.outputStream.flush();

旁注:我已成功通过电子邮件发送字节,它们作为 CSV 文件正确打开

【问题讨论】:

  • 您是否希望提示用户保存文件(或在外部应用程序中打开)而不是让浏览器打开它?如果是这样,请尝试:response.setHeader("Content-disposition", "attachment; filename=\"my_file.csv\"")
  • @AndrewvonDollen 我试图添加它,但仍然没有运气。它不会提示我下载。我也尝试过几种浏览器
  • 嗯,还有一个建议:可能不需要包含 Content-Transfer-Encoding 标头(请参阅stackoverflow.com/a/7289434/513321
  • @AndrewvonDollen 不幸的是仍然无法正常工作。我不知道它可能是什么。不过感谢您的帮助。
  • 我似乎也记得这有点繁琐......看看AttachmentableControllerdownload方法的来源 - 我知道这是可行的......

标签: csv grails


【解决方案1】:

尝试将 byte[] 包装为流:

response.outputStream << new ByteArrayInputStream(data.bytes)

对我有用的更完整的示例:

        try {
            ByteArrayInputStream inStream = new ByteArrayInputStream(data.bytes)
            response.setContentType("text/csv")
            //response.contentLength = data.bytes.length // optional, I think lets browser show progress?
            response.setHeader("Content-disposition", "attachment;filename=data.csv")
            // response.setHeader("Cache-Control", "no-transform") // Disable compression on the output          
            response.outputStream << inStream
        }
        finally {
            inStream.close()
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2014-11-14
    • 2015-10-27
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多