我试图在我的托管bean中获取PNG文件InputStream
,如下所示:
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
InputStream input = externalContext.getResourceAsStream("/myFile.png");
// input is null.
但是,InputStream
始终为空。这是怎么造成的,我该如何解决?
答案 0 :(得分:5)
显然,您将资源放在物理上错误的位置。
ExternalContext#getResourceAsStream()
,在servlet容器的情况下委托给ServletContext#getResoruceAsStream()
,其根目录在WAR的Web内容中(/WEB-INF
和{{的父文件夹) 1}}文件夹,因此其中的文件也可以这样使用),以及/META-INF
中所有JAR的/META-INF/resources
文件夹。对于JSF Web应用程序,它通常是XHTML,CSS,JavaScript和图像文件。
换句话说,它返回Web资源。它不会返回磁盘文件系统资源,因为您需要new FileInputStream()
。它也不会返回类路径资源,因为您需要ClassLoader#getResourceAsStream()
。类路径的根目录在a.o. /WEB-INF/lib
,/WEB-INF/classes
中的所有JAR,以及一些VM /服务器配置的文件夹,具体取决于运行时环境。
在通常的Web内容文件结构中,必须将资源文件放在此处,以便以所需方式获取它:
/WEB-INF/lib