从JSF中的托管bean获取资源文件的路径



我遇到了这种情况:在从托管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>标签

相关内容

  • 没有找到相关文章

最新更新