2012-03-01 44 views
11
不渲染streamedcontent

我使用streamedcontent呈现从JSF发送一个字节,然后发回的流媒体内容如下:graphicImage的在Primefaces

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

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

支持bean:

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

但我没有得到在JSF页面图像。我得到这条消息出现在服务器日志中:

警告:JSF1091:文件dynamiccontent中找不到MIME类型。要解决此问题,请将mime-type映射添加到应用程序web.xml。

和:

SEVERE: Error in streaming dynamic resource. 

可以请你帮我在这里,我不能找到有关这个问题的任何有用的信息

PS:

进出口使用以下库:

Mojarra 2.1.3

PrimeFaces 3.1.1

Glassfish 3.1

+0

可能重复(http://stackoverflow.com/questions/10073905/problems-displaying-database-blob-image-in -primefaces-graphicimage) – BalusC 2013-06-27 11:49:57

+0

相关/重复问题:http://stackoverflow.com/questions/8207325/display-image-from-database-with-pgraphicimage/,http://stackoverflow.com/questions/10073905/problems-显示数据库blob图像在primefaces-graphicimage,http://stackoverflow.com/questions/10944673/how-to-use-pgraphicimage-with-defaultstreamedcontent-in-an-uirepeat/,http:// stackoverflow .com/questions/8304967/how-to-use-pgraphicimage-with-streamedcontent-within-pdatatable/ – BalusC 2013-06-27 11:51:03

+1

@BalusC但这篇文章比你提到的一些“相关”问题还要旧! – fareed 2013-06-27 16:35:59

回答

10

找到问题所在。问题不在于图像。这是因为graphicimage标签是动态加载的(在尝试从数据表加载时出现类似的问题)。动态图像不能直接在数据表或数据网格中呈现。 (解决方法是分配一个参数并从ID中提取图像)。

然而,该解决方案是here

[在Primefaces graphicImage的显示数据库团块图像问题]的
3

一般来说,在获取graphimage的getter中创建StreamedContent并不是一个好主意。该图像将从其余内容的单独请求中提取,这意味着取决于迭代器的变量将不起作用。这意味着在对bytesToStreamedContent的相关调用中,bytes数组将为null/empty。如果在方法内部放置断点,您可能会看到在最后一次调用中没有以字节为单位的数据。

您需要确保在您仍然可以访问所有需要的内容的同时生成映像,然后将其以bytesToStreamedContent方式再次检索。如果没有看到代码的其余部分,这个问题是否会解决问题并且真正为你工作是很难说的。我会开始试图删除字节数组参数并返回一个静态图像,以确认这是问题。

+0

字节首先来自数据库并传递给JSF。然后从JSF发送请求以显示为流式内容来查看图像。但是,我试图从应用程序sourceFiles中将该文件作为输入流读取,并为streamedContent创建了一个添加,但仍然没有渲染。最后,我试图直接从静态源获取文件,如下所示: 并且这次它成功呈现。你怎么看? – fareed 2012-03-02 14:47:57

+0

如果使用像InputStream is = new FileInputStream(“C:\ images \ lemontree.jpg”);没有帮助,我真的不知道什么是错的。我主要关心的是car.image参数没有按照您的想法工作。 – MatsT 2012-03-05 10:06:13

4

这是一个奇怪的问题,我不认为将mime-type添加到web.xml会解决它。它被列为既是一个错误在PrimeFaces与目标为3.2

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

而且它也被列为钻嘴鱼科2.1.1开放的错误。有一个补丁提交了这个bug,但它看起来像你将不得不手动将代码应用到Mojarra 2.1.1源代码并构建它。人们会认为这将在2.1.3中得到解决,然而,Glassfish可能有自己的预先捆绑的Mojarra实现,它仍然处于较早的版本,您的应用程序可能会使用它。

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

编辑:

可以只是直接传递的字节[]作为参数传递给这样的方法。你可以做的事情是将汽车的id作为参数传递,然后检索该汽车并从Car实体中获取字节。原因是因为实际上呈现为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 2012-03-02 21:13:26

+2

@ ed See请参阅上面对我的回答的编辑。我认为也许你可能会错误地使用graphicImage。 – 2012-03-03 02:49:16

+1

我尝试了你在这里提出的建议,但我得到了同样的结果。我也尝试通过直接从支持bean传递一个定义的字符串来获取图像,并且Im获取相同的东西,而不是呈现。真的坚持这一个 – fareed 2012-03-03 14:26:21