我试图在 jsf 托管 bean 中访问example/web文件夹(见下图),但似乎无法找到一种方法来做到这一点
谢谢
尝试
FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()
用于构建应用中资源的相对 URL。
如果你想要真正的路径......
ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
.getExternalContext().getContext();
String realPath = ctx.getRealPath("/");
File
如果您出于某种原因想要获得它,那么您需要ExternalContext#getRealPath()
. 这会将相对 Web 路径转换为绝对磁盘文件系统。由于您需要网络的根文件夹,因此只需传入/
:
String absoluteWebPath = externalContext.getRealPath("/");
File webRoot = new File(absoluteWebPath);
// ...
与具体问题无关,无论您想到什么功能要求,您认为拥有指向 Web 文件夹的绝对本地磁盘文件系统路径是正确的解决方案,它肯定需要以不同的方式解决。事实上,根据您对另一个答案的评论,
因为我试图在文件夹中上传一些文件并使用相对路径
你走错路了。如果您打算将上传的文件保存得比 webapp 的部署生命周期更长,则不应在其中存储上传的文件。每当您重新部署 webapp(以及在某些服务器配置上,即使您重新启动服务器),上传的文件都会完全丢失,因为它们没有包含在原始 WAR 文件中。更重要的是,一些重型服务器配置根本不会在磁盘上扩展 WAR,而是在内存中,getRealPath()
然后总是返回null
.
而是将其存储在服务器部署文件夹之外的固定磁盘文件系统路径中。依次将该路径添加为新的服务器上下文或 docroot,以便可以在不同的(虚拟)上下文路径上访问它。或者自制一个 servlet,InputStream
它从磁盘获取其中的一个并将其写入OutputStream
响应。另请参阅此相关答案:上传的图片仅在刷新页面后可用
只是想感谢 Balus C。使用 JSP 编写 Java 代码,在 Tomcat/Tomee 服务器中,我使用以下代码:
private Boolean SaveUserItemImage(Part ui, String bid) throws IOException {
Boolean fileCreate = false;
OutputStream out = null;
InputStream filecontent = null;
ExternalContext ctx = context().getExternalContext();
String absoluteWebPath = ctx.getRealPath("/");
String resource_path = absoluteWebPath + "\\resources\\";
String image_path = resource_path + "\\" + this.itemType + "_images\\";
String buildFileName = image_path + bid + "_" + getFileName(ui);
File files = null;
try {
files = new File(buildFileName);
fileCreate = true;
} catch (Exception ex) {
System.out.println("Error in Creating New File");
Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, null, ex);
}
if (fileCreate == true) {
if (files.exists()) {
/// User may be using same image file name but has been editted
files.delete();
}
try {
out = new FileOutputStream(files);
filecontent = ui.getInputStream();
int read = 0;
final byte[] bytes = new byte[1024];
while ((read = filecontent.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
fileCreate = true;
} catch (FileNotFoundException fne) {
fileCreate = false;
Logger.getLogger(ItemBean.class.getName()).log(Level.SEVERE, "SaveUserItemImage", fne);
} finally {
if (out != null) {
out.close();
}
if (filecontent != null) {
filecontent.close();
}
files = null;
}
}
return fileCreate;
}
尝试:
String relativePath="/resources/temp/";
String absolutePath= FacesContext.getCurrentInstance.getExternalContext().getRealPath(relativePath);
File file = new File(absolutePath);
获得真正的路径。
在 resources/temp/ 中创建一个 tmp 文件以避免任何异常。