2011-06-07 96 views
10

我有这种情况:我试图在从托管bean中放入一个新的头像之前删除用户的旧头像图像。在JSF中从托管bean获取资源文件的路径

String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar(); 
File f = new File(fileName); 

我GOOGLE了一下,似乎我可以从得到的ExternalContext到该文件夹​​的路径,如:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
facesContext.getExternalContext(). ... 

但我无法从class docs找到一个合适的方法。你可以请帮忙,而不是......或建议一个更好的解决方案。

PS。不知何故,我怀疑有可能对链接进行硬编码,但目前为止没有运气。

回答

26

我知道该文件已嵌入到WAR中,并且您正在寻找ExternalContext#getRealPath()方法,以基于网络相对路径对其进行解析。根据Javadoc,此方法在JSF 2.0中引入,并且在JSF 1.x中不存在。你似乎在使用JSF 1.x,否则你不会问这个问题。你需要使用ServletContext#getRealPath()来代替(这也是新的JSF 2.0方法委托给的)。

String relativeWebPath = "/resources/img/useravatars/" + ...; 
ServletContext servletContext = (ServletContext) externalContext.getContext(); 
String absoluteDiskPath = servletContext.getRealPath(relativeWebPath); 
File file = new File(absoluteDiskPath); 
// ... 

然而,有一个大的:你可以不应该写以扩大战争。删除文件也在写。无论何时重新部署WAR或重新启动服务器,每次更改都会恢复,并且展开的WAR将保持其初始状态,从而会丢失自上次部署以来展开的WAR中所做的所有更改。

您确实需要将这些文件存储在外部位置,这些位置的根位置可以在某些外部配置(属性)文件中进行硬编码或定义。这样你就可以用通常的方式使用java.io.File

有几种方法可以从外部位置提供文件。你可以在以下问题的答案中找到它们:Load images from outside of webapps/webcontext/deploy folder using <h:graphicImage> or <img> tag

+0

这意味着,阅读就好了吗?我在那里得到了一些速度模板。 – alexander 2015-05-13 12:58:41

+0

@亚历山大:从来没有使用'getRealPath()'。只需使用'getResourceAsStream()'。这个方法也可以在'ExternalContext'上使用。相关:http://stackoverflow.com/questions/15972175/reading-properties-file-in-jsf2-0-which-can-work-in-war-also/ – BalusC 2015-05-13 19:18:24