Servlets 如何在基于servlet的web应用程序中临时保存生成的文件

Servlets 如何在基于servlet的web应用程序中临时保存生成的文件,servlets,relative-path,realpath,Servlets,Relative Path,Realpath,我正在尝试生成一个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

我正在尝试生成一个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\u 64\eclipse\src\main\webapp\WEB INF\pages\myFile.xml

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

只要用

文件relpath=新文件(“.\pages\”)


默认情况下,应用程序光标停留在web inf文件夹中。

切勿在Java EE web应用程序中使用相对本地磁盘文件系统路径,例如
新文件(“filename.xml”)
。有关详细说明,请参见


永远不要使用
getRealPath()
来获取写入文件的位置。有关详细说明,请参见

无论如何都不要将文件写入部署文件夹。有关详细说明,请参见

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

  • 硬编码:

      File folder = new File("/absolute/path/to/web/files");
      File result = new File(folder, "filename.xml");
      // ...
    
  • 或配置在:

  • 或利用:

  • 或利用:

另一种选择是使用(嵌入式)数据库或CDN主机(如S3)

另见:

您是否正在生成WAR文件并将其启动到tomcat这样的web服务器中?谢谢:)我明白了:)不允许您将文件系统与Java EE一起使用的原因是,它被设计为在多台主机上透明地工作。您的代码可能在写入时在一台主机上运行,在尝试读回结果时在另一台主机上运行。
  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");
  // ...