eclipse之Servlet 找不到我要打开的文件
我读到 servlet 根据 url 映射当前位置。单击我的 Home.jsp 页面上的按钮会将我定向到我的 servlet ExcelUploader。单击该按钮时的 URL 是
http://localhost:8080/ServletExample/ExcelUploader
我正在尝试打开与我的 JSP 位于同一文件夹中的 excel 文件。所以这意味着我必须相对于上面的 url 向上移动一个文件夹。我的 servlet 中有这个:
InputStream inp = new FileInputStream("../OpenMe.xls");
但是我还是得到了
java.io.FileNotFoundException: ..\OpenMe.xls (The system cannot find the file specified)
我的项目是这样设置的:
请您参考如下方法:
FileInputStream
在相对于工作目录的本地磁盘文件系统上运行,并且完全不知道它是从 Java EE Web 应用程序调用的。您传递给它的任何相对路径都是相对于在执行启动服务器的命令时打开的文件夹。这通常是服务器自己的安装文件夹,但如果是 IDE,这也可以是项目自己的根文件夹。无法从 Java 代码内部控制此变量。你不应该依赖它。
您已将该文件存储为公共(public)网络内容的资源。因此,ServletContext#getResourceAsStream()
将其作为网络内容资源提供。它返回一个 InputStream
。如果您有绝对正当的理由通过 URL 调用 servlet 而不是仅使用文件自己的 URL 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 文件扩展到内存而不是本地磁盘文件系统时,这将不起作用,这在第 3 方主机中通常是这种情况。 It would return null
then .
另见:
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。