Eclipse Servlet找不到文件I';我正试着打开

Eclipse Servlet找不到文件I';我正试着打开,eclipse,jsp,servlets,Eclipse,Jsp,Servlets,我了解到servlet基于url映射当前位置。单击我的Home.jsp页面上的一个按钮,我将进入我的servlet ExcelUploader。单击所述按钮时的URL为 http://localhost:8080/ServletExample/ExcelUploader 我试图打开一个excel文件,该文件与我的JSP文件位于同一文件夹中。这意味着我必须相对于上面的url向上移动一个文件夹。我的servlet中有以下内容: InputStream inp = new FileInputStr

我了解到servlet基于url映射当前位置。单击我的Home.jsp页面上的一个按钮,我将进入我的servlet ExcelUploader。单击所述按钮时的URL为

http://localhost:8080/ServletExample/ExcelUploader
我试图打开一个excel文件,该文件与我的JSP文件位于同一文件夹中。这意味着我必须相对于上面的url向上移动一个文件夹。我的servlet中有以下内容:

 InputStream inp = new FileInputStream("../OpenMe.xls");
不过我还是得到了一份工作

java.io.FileNotFoundException:..\OpenMe.xls(系统找不到指定的文件)

以下是我的项目的设置方式:


在webtree中的文件路径可用之前,必须使用“转换”路径,如下所示:

File excelFile = new File(getServletContext().getRealPath("/OpenMe.xls"));

使用默认包不是一个好主意,请为您的文件创建一个包。

相对于工作目录,
FileInputStream
在本地磁盘文件系统上运行,并且完全不知道它是从Java EE web应用程序调用的。您传递给它的任何相对路径都是相对于在执行启动服务器的命令时打开的文件夹的。这通常是服务器自己的安装文件夹,但对于IDE,这也可以是项目自己的根文件夹。这个变量不能从Java代码内部控制。你不应该依赖它

您已将该文件存储为公共webcontent的资源。因此,它可以作为webcontent资源使用,通过它可以返回
InputStream
。如果您完全有正当理由通过servlet的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文件扩展到内存中而不是本地磁盘文件系统中时,这将不起作用,这在第三方主机中经常发生

另见:

为了帮助区分路径错误和部署错误,您可以使用getServletContext()列出所有可用资源。GetResourcePath(“/”)