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

Posted

技术标签:

【中文标题】使用 HttpServletResponse 导出文件以供下载的 Grails 错误【英文标题】:Grails error using HttpServletResponse to export file for download 【发布时间】:2012-11-01 20:01:04 【问题描述】:

我在我的 Grails 应用程序中使用 opencsv 将属性从我的 Person 域类导出到 CSV。但是,我收到以下错误:

Servlet.service() for servlet [default] 在路径 [/myapp] 的上下文中抛出异常 [请求处理失败;嵌套异常是 org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: getOutputStream() has already been called for this response] 根本原因 消息:已为此响应调用 getOutputStream()

通过在线搜索,我认为答案可能是在某处为 HttpServletResponse 响应实现一些 responseComplete() 方法。但是,我不知道该怎么做。有任何想法吗?这是我的代码:

def export = 
    def course = Course.get(params.id)
    if(course)
        def persons = course ? Person.findAllByCourse(course) : []


        response.setHeader("Content-disposition",
           "attachment; filename=people.csv")
        response.contentType = "text/csv"
        def out = response.outputStream
        out.withWriter  writer ->

           String[] properties = new String[3]
           def csvWriter = new CSVWriter(writer)
           persons.each  person ->

              properties[0] = person.firstName
              properties[1] = person.lastName
              properties[2] = person.email
              properties[3] = person.phone
              properties[4] = person.address1
              properties[5] = person.address2
              properties[6] = person.city
              properties[7] = person.state
              properties[8] = person.zip5

              csvWriter.writeNext(properties)
           
           csvWriter.flush()
        

    

【问题讨论】:

你有没有在任何地方调用renderredirect(在上述代码之外)? 尝试使用gsp模板来填充数据的CSV和标准模型。 因为我对 Grails 有点陌生,所以当您说 CSV 的 gso 模板时,我不确定您指的是什么。你能详细说明一下或举个例子吗?谢谢! 【参考方案1】:

您的问题可能源于显式写入控制器中的输出流,然后是从您的操作返回时 GSP 呈现的默认行为。您可以检查How to prevent Grails from rendering the default view? 以了解另一种情况,并进行一些修复。我目前正在使用的机器上没有 grails 来重新创建问题,但听起来像在关闭结束时添加明确的 return null 可能会有所帮助。或者通过render 生成一些令牌输出或 200 状态码。

【讨论】:

【参考方案2】:

你必须把这个属性 String[] properties = new String[3] 改成 String[] properties = new String[9]。

它对我有用。

【讨论】:

以上是关于使用 HttpServletResponse 导出文件以供下载的 Grails 错误的主要内容,如果未能解决你的问题,请参考以下文章

jxl导出excel

Excel导出

POI导出工具类

jsp如何导出excel

Java导出Excel快速开始

优雅的实现 Excel 导入导出