我遇到这种情况:在尝试从托管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。不知何故,我怀疑有可能对链接进行硬编码,但到目前为止还没有运气。
答案 0 :(得分:28)
我知道该文件嵌入在WAR中,并且您正在寻找ExternalContext#getRealPath()
方法来根据Web相对路径解析它。根据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将保持其初始状态,从而丢失自上次部署以来在扩展WAR中所做的所有更改。
您确实需要将这些文件存储在外部位置,然后可以在某些外部配置(属性)文件中对其根位置进行硬编码或定义。通过这种方式,您可以按常规方式使用java.io.File
。
有多种方法可以从外部位置提供文件。您可以在以下问题的答案中找到它们:Load images from outside of webapps / webcontext / deploy folder using <h:graphicImage> or <img> tag