我读到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(系统找不到指定的文件)
这是我的项目设置方式:
答案 0 :(得分:3)
FileInputStream
在相对于工作目录的本地磁盘文件系统上运行,并且完全不了解它是从Java EE Web应用程序调用的事实。传递给它的任何相对路径都是相对于执行启动服务器命令时打开的文件夹。这通常是服务器自己的安装文件夹,但是在IDE的情况下,这也可以是项目自己的根文件夹。此变量不能从Java代码内部控制。你不应该依赖它。
您已将该文件存储为公共webcontent的资源。因此ServletContext#getResourceAsStream()
可以将其作为网站内容资源提供,返回InputStream
。如果您完全有合理的理由通过其URL调用servlet而不是仅使用文件自己的URL http://localhost:8080/ServletExample/OpenMe.xls
,那么您应该按如下方式进行:
InputStream input = getServletContext().getResourceAsStream("/OpenMe.xls");
// ...
如果您的意图确实是仅限制文件对servlet的访问,您可能需要考虑将文件移动到/WEB-INF
文件夹中,以便最终用户永远不能通过输入文件来直接打开它自己的网址。您只需要相应地更改资源路径。
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/OpenMe.xls");
// ...
您不应该按照其他答案的建议使用getRealPath()
。当servletcontainer配置为将WAR文件扩展到内存而不是本地磁盘文件系统时,这将不起作用,这在第三方主机中通常就是这种情况。 It would return null
then
答案 1 :(得分:1)
生成在网页中的文件的路径必须先使用getRealPath进行“翻译”才能使用,如下所示:
File excelFile = new File(getServletContext().getRealPath("/OpenMe.xls"));
当你使用默认包时,使用默认包不是一个好主意,为你的文件创建一个包。