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:\Users\userName\Desktop\Source\MyProject\src\main\webapp\WEB-INF\pages\myFile.xml).

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

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

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

Answers


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.

See also:

just use

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

as application cursor in default stay into web-inf folder.


Need Your Help

How should I rename many Stored Procedures without breaking stuff?

sql-server visual-studio stored-procedures renaming

My database has had several successive maintainers over the years and any naming guidelines that may have once been in place have been ignored.

Checking in of "commented out" code

version-control tfs coding-style

Ok, here is something that has caused some friction at my current job and I really didn't expect it to. Organized in house software development is a new concept here and I have drawn up a first dra...