我遇到了这种情况:在从托管bean中放入新的化身之前,我试图删除用户的旧化身图像。
String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar();
File f = new File(fileName);
我在谷歌上搜索了一下,似乎可以从ExternalContext中获得该文件夹的路径,比如:
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext(). ...
但是我在类文档中找不到合适的方法。你能帮忙放什么而不是。。。或者提出更好的解决方案。
PS。不知怎么的,我怀疑硬编码链接是可能的,但到目前为止没有运气。
我知道该文件嵌入在WAR中,您正在寻找基于web相对路径的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将保持其初始状态,从而丢失自上次部署以来在扩展后的WAR中所做的所有更改。
您确实需要将这些文件存储在一个外部位置,然后可以在一些外部配置(属性)文件中对其根位置进行硬编码或定义。通过这种方式,您可以以通常的方式使用java.io.File
内容。
有几种方法可以从外部位置提供文件。您可以在以下问题的答案中找到它们:使用<h: graphicImage>或者<img>标签