如何避免路径中的硬代码完整路径#get method

问题描述:

我想将Primefaces UploadedFile的副本保存到我的项目目录中。我一直在寻找解决方案的互联网,我发现使用Paths#get方法。 this答案中给出的例子是Paths.get("/path/to/uploads");,问题是,/path/to/uploads的确切路径在哪里?我找不到它。我的意思是我应该在哪里创建路径/path/to/uploads?在我的项目目录下?但哪个文件夹?我解决这个问题暂时被硬编码像Paths.get("C:/uploads/");如何避免路径中的硬代码完整路径#get method

+0

永远不会将上传的文件保存到您的项目目录中......通过重新部署,它全部消失了。保存在webapp外... https://*.com/questions/4358493/j2ee-primefaces-fileupload-file-saving-destination和https://*.com/questions/14211843/how-to-save-上传的文件在jsf – Kukeltje

+0

而路径字符串以a开头,所以它对当前文件系统abdolute – Kukeltje

FacesContext.getCurrentInstance().getExternalContext().getRealPath("/")会返回您当前项目的安装目录。

而@Kukeltje建议,永远不要将上传的文件保存到您的项目目录中,......将它保存在webapps之外甚至是您的容器之外。

因此,创建一个目录外部您的容器(你想放置你上传的副本),并追加../到上述路径为每个后退步骤。

说,如果你的应用程序部署在D:/Tools/Tomcat7/webapps/your-application-name(例如,在Windows上使用Tomcat),你想拷贝保存到D:/Tools/uploads那么下面会给你所需的文件路径:

String uploadsFilePath = FacesContext.getCurrentInstance().getExternalContext() 
    .getRealPath("../../../uploads"); 

Paths.get(uploadsFilePath)使用它,开发你的下载逻辑(我不确定你使用0​​类的库)。

+0

我几乎总是建议使用绝对路径。然后你永远不依赖于安装位置。我知道Q是关于避免'绝对'路径,但绝对路径应该是可配置的。您现在依赖**硬编码**相对路径... – Kukeltje

+0

是的,它是相对路径,但不是**硬编码**,因为'FacesContext.getCurrentInstance().getExternalContext()。getRealPath(“/”)'将根据OS返回应用程序的动态安装目录。对于'uploads'文件夹,它也可以从代码创建(如果不存在)。 –

如何getClassLoader().getResource(Path/to/file)

的完整路径,所以像

MyClass.class.getResource(bla/bla) 

现在被嵌套在src/resources

这样你的系统独立 #profit

您有几种选择:

  1. 对于非常快速的发展,可以用硬编码的路径,但可以肯定的是它在你的存在SUT(被测系统)。
  2. 您可以将其定义为模块中的静态最终字符串,但这意味着每次要更改该路径时,都需要重新编译...
  3. 您可以从属性/ config中读取该值文件。

还有更多的选择(如使用注册表,如果你在Windows上,或使用环境变量)。