【问题标题】:graphicimage not rendering streamedcontent in Primefaces图形图像未在 Primefaces 中呈现流式内容
【发布时间】:2012-03-20 11:12:54
【问题描述】:

我正在使用 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

【问题讨论】:

标签: jsf-2 primefaces


【解决方案1】:

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

不过,解决办法是here

【讨论】:

    【解决方案2】:

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

    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
    }
    

    【讨论】:

    • 那么我有哪些选项可以将我的字节数组呈现为 jsf 页面上的图像?
    • @fareed 请参阅上面对我的答案的编辑。我认为您可能使用不正确的图形图像。
    • 我尝试了你在这里提出的建议,但得到了相同的结果。我还尝试通过直接从支持 bean 传递定义的字符串来获取图像,我得到了同样的东西,它没有渲染。真的坚持这个
    【解决方案3】:

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

    您需要确保在您仍然可以访问所有需要的内容时生成图像,然后以您可以在 bytesToStreamedContent 中再次检索它的方式存储它。如果不查看其余代码,很难说这是否会解决问题并真正为您工作。我将首先尝试删除字节数组参数并返回静态图像以确认这是问题所在。

    【讨论】:

    • 字节首先来自数据库并传递给 JSF。然后从 JSF 即时发送请求以显示为流式内容以查看图像。但是,我尝试从应用程序 sourceFiles 将文件作为输入流读取并创建一个添加到 streamedContent 但它仍然没有呈现。最后,我尝试直接从静态源获取文件,如下所示: 这一次它渲染成功。你怎么看?
    • 如果使用像 InputStream 这样的东西 = new FileInputStream("C:\images\lemontree.jpg");没有帮助,我真的不知道出了什么问题。我最关心的是 car.image 参数没有像你想象的那样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2021-10-05
    • 2016-01-01
    • 2011-05-16
    • 2018-11-07
    • 2017-11-09
    相关资源
    最近更新 更多