我已将图像保存到命令对象中的byte [],并希望在createFlow webflow的下一阶段显示它。
我正试图避免使用文件系统和/或数据库系统在网络流程中存储图像。
通常,要查看图像,我会从gsp中调用renderImage:
class ArtefactController {
def createFlow = {
............
}
def renderImage = {
def ArtefactInstance = Artefact.findById(params.id)
if(ArtefactInstance?.image) {
response.setContentLength(ArtefactInstance.image.length)
response.outputStream.write(ArtefactInstance.image)
}
else {
response.sendError(404)
}
}
然而,当我尝试从gsp调用renderFlowImage时的webflow:
def renderFlowImage = {
if(flow.artefactCommand?.image) {
response.setContentLength(flow.artefactCommand.image.length)
response.outputStream.write(flow.artefactCommand.image)
}
else {
response.sendError(404)
}
}
流量范围无法访问。
有什么建议吗?
答案 0 :(得分:0)
我假设您正在流程视图中使用第二个http请求通过img标记点击renderFlowImage操作,例如:
<img src="${createLink(action:'renderFlowImage')}" />
这不起作用,因为,首先,你需要传入一个'flowExecutionKey',grails使用它来匹配一个请求和一个流。 可以解决这个问题,但最好只在流程的下一个视图的渲染阶段使用img标记中的数据URI渲染图像。您可以使用渲染插件轻松完成此操作,渲染插件提供了一些方便的标记(以及其他内容),使用数据uri渲染内嵌图像。 因此,在下一个流视图中,您可以通过调用其中一个渲染插件的“内联”标记来替换现有的img标记:
<rendering:inlineJpeg bytes="${artefactCommand.image}" />
但要小心 - 要了解数据URI方法存在一些限制(请参阅http://www.7cynics.com/webdesign/css/css-inline-images-data-uri.html)。