Grails Webflow显示图像 - 流量范围

时间:2011-09-13 01:14:06

标签: image grails scope spring-webflow

我已将图像保存到命令对象中的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)
    }
}

流量范围无法访问。

有什么建议吗?

1 个答案:

答案 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)。