如何避免路径中的硬代码完整路径#get method
我想将Primefaces UploadedFile
的副本保存到我的项目目录中。我一直在寻找解决方案的互联网,我发现使用Paths#get
方法。 this答案中给出的例子是Paths.get("/path/to/uploads");
,问题是,/path/to/uploads
的确切路径在哪里?我找不到它。我的意思是我应该在哪里创建路径/path/to/uploads
?在我的项目目录下?但哪个文件夹?我解决这个问题暂时被硬编码像Paths.get("C:/uploads/");
如何避免路径中的硬代码完整路径#get method
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类的库)。
我几乎总是建议使用绝对路径。然后你永远不依赖于安装位置。我知道Q是关于避免'绝对'路径,但绝对路径应该是可配置的。您现在依赖**硬编码**相对路径... – Kukeltje
是的,它是相对路径,但不是**硬编码**,因为'FacesContext.getCurrentInstance().getExternalContext()。getRealPath(“/”)'将根据OS返回应用程序的动态安装目录。对于'uploads'文件夹,它也可以从代码创建(如果不存在)。 –
如何getClassLoader().getResource(Path/to/file)
的完整路径,所以像
MyClass.class.getResource(bla/bla)
现在被嵌套在src/resources
这样你的系统独立 #profit
您有几种选择:
- 对于非常快速的发展,可以用硬编码的路径,但可以肯定的是它在你的存在SUT(被测系统)。
- 您可以将其定义为模块中的静态最终字符串,但这意味着每次要更改该路径时,都需要重新编译...
- 您可以从属性/ config中读取该值文件。
还有更多的选择(如使用注册表,如果你在Windows上,或使用环境变量)。
永远不会将上传的文件保存到您的项目目录中......通过重新部署,它全部消失了。保存在webapp外... https://*.com/questions/4358493/j2ee-primefaces-fileupload-file-saving-destination和https://*.com/questions/14211843/how-to-save-上传的文件在jsf – Kukeltje
而路径字符串以a开头,所以它对当前文件系统abdolute – Kukeltje