从 Web 应用程序读取文件是一个典型的陷阱,无论何时执行此操作都会受到影响。
Web 应用程序(尤其是 Java EE)没有考虑使用文件系统进行读/写操作,它们依赖于容器(在您的情况下为 Tomcat)知道如何获取所需资源的事实。
所以基本的建议是:不要这样做。
但由于我基本上讨厌这种答案,所以我会给你一些建议。
永远不要使用工作目录
你永远不知道你的工作目录在哪里,而且更常见的是,在任何生产系统中,web-app 都无权在工作目录上写入。
例如,如果你将 webapp 部署到 tomcat 服务器,在 windows 机器上作为服务运行,你会发现你的工作目录是\Windows\System32
你真的不想在那里写一些上传的文件,例如......
你有几个选择,我更喜欢在 web-xml 中设置一个路径,并可能从服务器配置中覆盖它(使用上下文)。
第二个选项,更好的是,将路径保存到 Web 应用程序访问的数据库表中。
前任:
在你设置的 web.xml
<context-param>
<description>Uploaded files directory</description>
<param-name>file-storage</param-name>
<param-value>c:\app\storage\uploaded</param-value>
</context-param>
然后在你的 server.xml 中(或者你可以使用上下文目录并在那里放置一个包含以下代码的文件)你在上下文中覆盖这个设置。
<Context
<Parameter
name="file-storage"
value="E:\app\storage\uploaded"
type="java.lang.String"
override="false" />
</Context>
检查tomcat文档
第三个选项,在稍微愉快的情况下,您只想编写一些临时文件,webapp 工作目录可作为 servlet 上下文参数访问,名为:
javax.servlet.context.tempdir
如果我在你那里我会去数据库表。
所有这些复杂性是因为您可以在不同的tomcat实例上拥有同一个应用程序的多个实例,甚至在不同的机器上,甚至将不同的Web应用程序放到同一个实例中,因此没有简单的方法来制作“相对”路径就是全部情况。
大多数网络应用程序决定在 db 上序列化数据(使用 lob 或类似对象),只要有这种必要性,或者依赖某种服务(FTP、cifs、nfs ...)。