以下操作旨在将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)。
问题:
答案 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。
以下是两个解决方法:
render(contentType: "text/html", text: htmlString)
。这将绕过视图层。response.contentType = ''
清除内容类型。这也将绕过视图层。但请注意,内容将在没有Content-Type的情况下提供给最终用户,这可能会使某些浏览器感到困惑。