使用 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()
【问题讨论】:
你有没有在任何地方调用render
或redirect
(在上述代码之外)?
尝试使用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 错误的主要内容,如果未能解决你的问题,请参考以下文章