在 Grails 4.2.2 中将 CSV 下载到浏览器

Posted

技术标签:

【中文标题】在 Grails 4.2.2 中将 CSV 下载到浏览器【英文标题】:Download CSV to browser in Grails 4.2.2 【发布时间】: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 标头(请参阅***.com/a/7289434/513321) @AndrewvonDollen 不幸的是仍然无法正常工作。我不知道它可能是什么。不过感谢您的帮助。 我似乎也记得这有点繁琐......看看AttachmentableController的download方法的来源 - 我知道这是可行的...... 【参考方案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()
        

【讨论】:

以上是关于在 Grails 4.2.2 中将 CSV 下载到浏览器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Streamlit 中将 Pandas DataFrame 下载到 CSV 文件

使用 HttpServletResponse 导出文件以供下载的 Grails 错误

如何从 csv 文件中获取数据并使用 mysql 保存到 grails 中?

访问被拒绝并获取 抱歉,在 grails 中将插件 Spring Security 核心升级到 2.0 版本后,您无权查看此页面

在 Angular 应用程序中将 json 文件(从 json-server)下载为 txt 或 json 或 csv 文件

如何在 Angular 中将动态 JSON 对象数组导出为 CSV?