Primefaces中的streamedcontent无法渲染graphicimage。

11

我正在使用streamedcontent将从JSF发送的字节流渲染,然后将其作为流式内容发送回来,如下所示:

<p:graphicImage value="#{manage.bytesToStreamedContent(car.image)}"/>

其中 image 是存储在数据库中的图像的字节数组

后端 Bean:

public StreamedContent bytesToStreamedContent(byte[] bytes)
{
    InputStream is = new ByteArrayInputStream(bytes);
    StreamedContent image = new DefaultStreamedContent (is, "image/jpeg");
    return image;
}

但是在JSF页面上我没有得到图片。我在服务器日志中看到了这个消息:

警告:JSF1091:找不到动态内容文件的MIME类型。要解决此问题,请将MIME类型映射添加到应用程序的web.xml中。

以及:

SEVERE: Error in streaming dynamic resource.
你能帮我解决这个问题吗?我找不到任何有用的信息。
PS:
我正在使用以下库:
Mojarra 2.1.3
PrimeFaces 3.1.1
Glassfish 3.1

相关/重复问题:https://dev59.com/VWsy5IYBdhLWcg3w9Srk,https://dev59.com/xGkw5IYBdhLWcg3wMHkY,https://dev59.com/ZWTWa4cB1Zd3GeqPGL3S,https://dev59.com/K2sy5IYBdhLWcg3w0RM5 - BalusC
1
@BalusC 但是这篇文章比你提到的一些“相关”问题要旧!!! - fareed
帖子的年龄并不重要。重复链接只是指向规范答案的,该答案深入解释和解决了问题,您无需离开网站即可解决问题。 - BalusC
3个回答

11

找到了问题所在。问题不在于图像,而是因为图像标签是动态加载的(类似于从datatable加载时出现的问题)。动态图像不能直接在datatable或datagrid中呈现。(解决方法是分配一个参数并从id中获取图像)。

然而,解决方案在这里


4
这是一个奇怪的问题,我认为在web.xml中添加mime类型并不能解决它。PrimeFaces中列出了一个针对3.2版本的bug。

http://code.google.com/p/primefaces/issues/detail?id=3546

同时,它也被列为Mojarra 2.1.1的一个开放性错误。对于这个错误已经有一个修补程序提交了,但是看起来你必须手动将代码应用到Mojarra 2.1.1源码并进行构建。人们会认为这个问题在2.1.3中已经得到了解决,然而,Glassfish可能有自己预先打包的Mojarra实现,仍然停留在早期版本,你的应用程序可能正在使用它。

http://java.net/jira/browse/JAVASERVERFACES-2103

编辑:

你可以直接将byte[]作为参数传递给该方法。但是,你可以传递汽车的id作为参数,然后检索该汽车并从Car实体中提取字节。原因是graphicImage实际上呈现为HTML img标签,并且这会在与JSF页面的请求分开的单独HTTP请求中发生。下载并安装Firefox的Firebug插件,你将看到这种情况发生,页面被请求,然后在检索页面之后进行图像的后续请求。由于这个原因,ViewScoped和RequestScoped bean不能以这种方式访问,但是仍然可以通过请求参数传递所需信息来检索Car字节以获取图像。

<p:graphicImage value="#{manage.bytesToStreamedContent}">
<f:param name="item_id" value="#{car.id}" />
</p:graphicImage>

现在在您的托管bean属性中,您可以获取汽车ID,获取汽车ID后,您应该能够获取正确的汽车。

public StreamedContent getBytesToStreamedContent() {
  String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("item_id");
  //Now get the car with the id
}

1
那么,我在JSF页面上展示我的字节数组作为图像的选项有哪些? - fareed
2
@fareed 请看我上面回答的修改。我认为你可能在错误地使用graphicImage。 - maple_shaft
1
我尝试了你在这里建议的方法,但是我得到了相同的结果。我还尝试了直接从后端bean传递定义的字符串来获取图像,但是我得到了相同的结果,它没有渲染。真的卡在这个问题上了。 - fareed

3
总的来说,不建议在图像获取器中创建StreamedContent。图像将在与其余内容分开的请求中获取,这意味着依赖于迭代器的变量将不起作用。这意味着,在调用bytesToStreamedContent时,字节数组将为null / empty。如果您在该方法内设置断点,则可能会发现在最后一个调用中没有数据。
您需要确保在仍然可以访问所有所需内容的情况下生成图像,然后以一种可以再次检索它的方式存储它,以供bytesToStreamedContent使用。是否会解决问题并实际起作用,很难在不看到其余代码的情况下说。我建议尝试删除字节数组参数并返回静态图像,以确认这是否是问题。

首先,字节码从数据库中获取并传递给JSF。然后,我从JSF发送请求以流的形式显示图像内容。但是,我尝试从应用程序sourceFiles中读取文件作为inputstream,并创建一个add到streamedContent,但仍未呈现。最后,我尝试直接从静态源获取文件,如下所示:<p:graphicImage value="images/lemontree.jpg"/>这次成功呈现了。你觉得呢? - fareed
如果使用类似InputStream is = new FileInputStream("C:\images\lemontree.jpg");这样的代码没有帮助,我真的不知道出了什么问题。我主要关心的是car.image参数是否按照您的预期工作。 - MatsT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接