如何获取公共Webcontent资源的InputStream?

时间:2012-01-19 19:15:51

标签: java jsf primefaces

我在WAR中打包了一组图像,并使用<p:dataGrid><p:graphicImage>中对其进行描述。图像位于/resources/icons文件夹中。我希望能够在提交时选择图像并将此图像的副本保存到磁盘。

如何做到这一点?如何获得此图像的引用(InputStream或其他)?

1 个答案:

答案 0 :(得分:2)

鉴于此文件夹结构,

YourProject
 |-- src
 |    `-- com
 |         `-- example
 |              `-- BackingBean.java
 |-- WebContent
 |    |-- META-INF
 |    |-- WEB-INF
 |    |-- resources
 |    |    `-- icons
 |    |         `-- foo.png
 |    `-- foo.xhtml
 :

你可以通过ExternalContext#getResourceAsStream()得到它,它采用webcontent-relative路径:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = externalContext.getResourceAsStream("/resources/icons/foo.png");
// ...

Resource#getInputStream()其中Resource来自ResourceHandler#createResource(),其中/resources - 相对路径为:

ResourceHandler resourceHandler = FacesContext.getCurrentInstance().getApplication().getResourceHandler();
InputStream input = resourceHandler.createResource("icons/foo.png").getInputStream();
// ...

关于选择图像并传递其路径,只需执行以下操作:

<h:graphicImage name="icons/foo.png">
    <f:ajax event="click" listener="#{bean.setImage(component.name)}" />
</h:graphicImage>
<h:graphicImage name="icons/bar.png">
    <f:ajax event="click" listener="#{bean.setImage(component.name)}" />
</h:graphicImage>
<h:commandButton value="submit" action="#{bean.saveImage}" />

另见: