将二进制内容直接写入客户端,绕过Grails视图层

时间:2009-10-31 23:06:29

标签: grails

以下操作旨在将bytes的二进制内容直接写入客户端,完全绕过Grails视图层:

def actionName = {
  byte[] bytes = ...
  ServletOutputStream out = response.getOutputStream()
  out.write(bytes)
  out.flush()
  out.close()
  return false
}

我的印象是return false会让Grails完全跳过视图层。但是,似乎并非如此,因为上面的代码仍然使Grails搜索/WEB-INF/grails-app/views/controllerName/actionName.jsp(由于没有这样的文件存在,因此无法使用404)。

问题:

  • 根据上面的代码,我如何完全绕过Grails中的视图层?

2 个答案:

答案 0 :(得分:7)

您应该返回null或者根本不返回任何内容,这被解释为null。以下是来自发送动态生成的PDF的操作的一些工作代码:

def pdf = {
   byte[] content = ...
   String filename = ...
   response.contentType = 'application/octet-stream'
   response.setHeader 'Content-disposition', "attachment; filename=\"$filename\""
   response.outputStream << content
   response.outputStream.flush()
}

答案 1 :(得分:2)

如果response.contentType.startsWith('text/html'),Grails会尝试渲染视图。这似乎是一个已知的错误,请参阅GRAILS-1223

以下是两个解决方法:

  1. GRAILS-1223中的建议使用render(contentType: "text/html", text: htmlString)。这将绕过视图层。
  2. 使用response.contentType = ''清除内容类型。这也将绕过视图层。但请注意,内容将在没有Content-Type的情况下提供给最终用户,这可能会使某些浏览器感到困惑。