它FileInputStream
在相对于工作目录的本地磁盘文件系统上运行,并且完全不知道它是从 Java EE Web 应用程序调用的事实。您传递给它的任何相对路径都相对于在执行启动服务器的命令时打开的文件夹。这通常是服务器自己的安装文件夹,但如果是 IDE,这也可以是项目自己的根文件夹。此变量无法从您的 Java 代码内部控制。你不应该依赖它。
您已将该文件存储为公共 Web 内容的资源。所以它可以作为一个 webcontent 资源使用,通过ServletContext#getResourceAsStream()
它返回一个InputStream
. 如果您绝对有正当理由通过其 URL 而不是仅使用文件自己的 URL 调用 servlet http://localhost:8080/ServletExample/OpenMe.xls
,那么您应该得到如下信息:
InputStream input = getServletContext().getResourceAsStream("/OpenMe.xls");
// ...
如果您的意图确实是限制文件仅由 servlet 访问,您可能需要考虑将文件移动到文件/WEB-INF
夹中,以便最终用户永远无法通过输入文件自己的 URL 直接打开它。您只需要相应地更改资源路径。
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/OpenMe.xls");
// ...
您不应该getRealPath()
按照其他答案的建议使用。当 servletcontainer 被配置为将 WAR 文件扩展到内存而不是本地磁盘文件系统时,这将不起作用,这在 3rd 方主机中通常是这种情况。那时它会回来null
。
也可以看看: