2

我正在尝试InputStream在我的托管 bean 中获取 PNG 文件,如下所示:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = externalContext.getResourceAsStream("/myFile.png");
// input is null.

但是,InputStream始终为空。这是如何引起的,我该如何解决?

4

1 回答 1

6

显然,您将资源放置在错误的位置。

ExternalContext#getResourceAsStream()它在 servlet 容器的情况下委托给ServletContext#getResoruceAsStream(),它的根位于 WAR 的 Web 内容中(和文件夹的父文件/WEB-INF/META-INF,因此其中的文件也可以通过这种方式获得),并且/META-INF/resources所有 JAR 的文件夹在/WEB-INF/lib. 对于 JSF Web 应用程序,它通常是 XHTML、CSS、JavaScript 和图像文件。

换句话说,它返回 Web 资源。它不会返回磁盘文件系统资源,因为您需要它new FileInputStream()。它也不会返回类路径资源,因为您需要它ClassLoader#getResourceAsStream()。类路径的根位于 ao 中/WEB-INF/classes,所有 JAR 位于 中/WEB-INF/lib,以及一些 VM/服务器配置的文件夹,具体取决于运行时环境。

在通常的 Web 内容文件结构中,资源文件必须准确地放置在此处,以便以所需的方式获得它:

WebContent
 |-- META-INF
 |-- WEB-INF
 |    |-- faces-config.xml
 |    `-- web.xml
 |-- myFile.png    <-- Here.
 :
于 2015-03-06T08:45:51.843 回答