Как временно сохранить созданный файл в веб-приложении на основе сервлета
Я пытаюсь создать файл 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
на моем сервере. Может кто-нибудь помочь?
2 ответа
Никогда не используйте относительные пути файловой системы локального диска в веб-приложении Java EE, например new File("filename.xml")
, Для более подробного объяснения смотрите также getResourceAsStream() vs FileInputStream.
Никогда не используйте getRealPath()
с целью получения места для записи файлов. Более подробное объяснение см. Также Что означает servletcontext.getRealPath("/") и когда я должен его использовать.
Никогда не пишите файлы для развертывания папки. Подробное объяснение см. Также в разделе " Рекомендуемый способ сохранения загруженных файлов в приложении сервлета".
Всегда записывайте их во внешнюю папку по заранее заданному абсолютному пути.
Либо жестко закодировано:
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"); // ...
Альтернативой является использование (встроенной) базы данных.
Смотрите также:
- Рекомендуемый способ сохранения загруженных файлов в приложении сервлета
- Где разместить и как прочитать файлы ресурсов конфигурации в приложении на основе сервлетов?
- Простые способы хранения данных о повторном развертывании веб-приложения Java EE 7
- Храните PDF в течение ограниченного времени на сервере приложений и сделайте его доступным для загрузки
- Что означает servletcontext.getRealPath("/") и когда я должен его использовать
- getResourceAsStream() против FileInputStream
Просто используйте
File relpath = new File(".\ Pages\");
в качестве курсора приложения по умолчанию остается в папке web-inf.