gpt4 book ai didi

java - 为什么 getClass().getProtectionDomain().getCodeSource().getLocation().getPath() 在编译后的最终产品中不起作用?

转载 作者:行者123 更新时间:2023-12-02 05:36:49 27 4
gpt4 key购买 nike

好的,这是我的 Web 项目。我在 eClipse 中构建了它,结构如下:

workspace3\MyProject\war\images\uploaded
workspace3\MyProject\war\WEB-INF\classes

好的,我想将上传的图像存储到 workspace3\MyProject\war\images\unloaded 中,所以这里是服务端的代码,它在 Eclipse 中运行良好

String absolutePath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
absolutePath=absolutePath.replace("WEB-INF/classes/", "images/uploaded");
File file = File.createTempFile("upload-", "."+extName, new File(absolutePath));

好的,现在我编译了我的项目并将其放入带有 Tomcat 服务器的 VPS 中,它具有以下结构

tomcat7\webapps\ROOT\images\uploaded
tomcat7\webapps\ROOT\WEB-INF\classes

但是,不知何故,当通过互联网运行网站时,它找不到 images\uploaded 位置。

我在这里做错了什么吗?为什么 getClass().getProtectionDomain().getCodeSource().getLocation().getPath() 在编译后的最终产品中不起作用?

最佳答案

您应该使用ServletContext#getRealPath(...)确定 Web 应用程序的文件系统路径:

String absolutePath = request.getServletContext().getRealPath("/images/uploaded");
// File uploaded to this directory will be accessible via
// `http://<yourserver>/<web-app>/images/uploaded/`

但是要小心! Servlet 规范不保证 getRealPath 将返回可写目录的路径。如果虚拟路径无法转换为真实路径,它可能会返回 null!

如果您想确定目标是可写目录,并且您只想将文件上传到临时目录进行处理,请考虑使用 web application's private temp directory :

File tempDir = (File)request.getServletContext().getAttribute(ServletContext.TEMPDIR);
// Files uploaded to that directory will NOT be automatically published to WWW.

请注意,此目录只是临时目录,服务器重新启动后可能无法保留!所以不考虑持久性。

最明智和持久的解决方案是将文件写入数据库或任何其他存储库(例如 JCRJackrabbit ),或写入不受 Web 服务器控制的文件目录(并且指定从外部,例如通过系统属性或在 web.xml 中)。

关于java - 为什么 getClass().getProtectionDomain().getCodeSource().getLocation().getPath() 在编译后的最终产品中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com