3

我读到 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(系统找不到指定的文件)

这就是我的项目的设置方式:

项目设置

4

2 回答 2

3

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

也可以看看:

于 2012-06-28T17:00:10.850 回答
2

位于 webtree 中的文件的路径必须使用getRealPath进行“翻译”,然后才能使用,如下所示:

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

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

于 2012-06-28T15:43:19.840 回答