15

我正在尝试生成一个 XML 文件并将其保存在/WEB-INF/pages/.

下面是我使用相对路径的代码:

File folder = new File("src/main/webapp/WEB-INF/pages/");
StreamResult result = new StreamResult(new File(folder, fileName));

在我的本地机器上作为应用程序运行时工作正常(C:\Users\userName\Desktop\Source\MyProject\src\main\webapp\WEB-INF\pages\myFile.xml).

但是在服务器机器上部署和运行时,它会抛出以下异常:

javax.xml.transform.TransformerException: java.io.FileNotFoundException C:\project\eclipse-jee-luna-R-win32-x86_64\eclipse\src\main\webapp\WEB INF\pages\myFile.xml

我也试过getServletContext().getRealPath()了,但它null在我的服务器上返回。有人可以帮忙吗?

4

2 回答 2

31

切勿在 Java EE Web 应用程序中使用相对本地磁盘文件系统路径,例如new File("filename.xml"). 有关深入解释,另请参阅getResourceAsStream() 与 FileInputStream

切勿使用getRealPath()以获取写入文件的位置为目的。有关深入解释,另请参阅servletcontext.getRealPath("/") 是什么意思以及我应该何时使用它

永远不要将文件写入部署文件夹。有关详细说明,另请参阅在 servlet 应用程序中保存上传文件的推荐方法

始终将它们写入预定义绝对路径上的外部文件夹。

  • 硬编码:

      File folder = new File("/absolute/path/to/web/files");
      File result = new File(folder, "filename.xml");
      // ...
    
  • 以多种方式之一进行配置:

      File folder = new File(System.getProperty("xml.location"));
      File result = new File(folder, "filename.xml");
      // ...
    
  • 或使用容器管理的临时文件夹

      File folder = (File) getServletContext().getAttribute(ServletContext.TEMPDIR);
      File result = new File(folder, "filename.xml");
      // ...
    
  • 或使用操作系统管理的临时文件夹

      File result = File.createTempFile("filename-", ".xml");
      // ...
    

另一种方法是使用(嵌入式)数据库或 CDN 主机(例如 S3)。

也可以看看:

于 2015-07-06T21:10:50.593 回答
-2

只需使用

文件 relpath = new File(".\pages\");

作为默认的应用程序光标停留在 web-inf 文件夹中。

于 2015-07-06T21:04:18.863 回答