Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
465 views
in Technique[技术] by (71.8m points)

relative path - How to save generated file temporarily in servlet based web application

I am trying to generate a XML file and save it in /WEB-INF/pages/.

Below is my code which uses a relative path:

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

It's working fine when running as an application on my local machine (C:UsersuserNameDesktopSourceMyProjectsrcmainwebappWEB-INFpagesmyFile.xml).

But when deploying and running on server machine, it throws the below exception:

javax.xml.transform.TransformerException: java.io.FileNotFoundException C:projecteclipse-jee-luna-R-win32-x86_64eclipsesrcmainwebappWEB INFpagesmyFile.xml

I tried getServletContext().getRealPath() as well, but it's returning null on my server. Can someone help?

Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Never use relative local disk file system paths in a Java EE web application such as new File("filename.xml"). For an in depth explanation, see also getResourceAsStream() vs FileInputStream.

Never use getRealPath() with the purpose to obtain a location to write files. For an in depth explanation, see also What does servletcontext.getRealPath("/") mean and when should I use it.

Never write files to deploy folder anyway. For an in depth explanation, see also Recommended way to save uploaded files in a servlet application.

Always write them to an external folder on a predefined absolute path.

  • Either hardcoded:

      File folder = new File("/absolute/path/to/web/files");
      File result = new File(folder, "filename.xml");
      // ...
    
  • Or configured in one of many ways:

      File folder = new File(System.getProperty("xml.location"));
      File result = new File(folder, "filename.xml");
      // ...
    
  • Or making use of container-managed temp folder:

      File folder = (File) getServletContext().getAttribute(ServletContext.TEMPDIR);
      File result = new File(folder, "filename.xml");
      // ...
    
  • Or making use of OS-managed temp folder:

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

The alternative is to use a (embedded) database or a CDN host (e.g. S3).

See also:


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...