По спецификации, единственный "реальный" путь, который вы гарантированно получите из контейнера сервлета, - это временный каталог.
Вы можете получить это через ServletContext.gerAttribute("javax.servlet.context.tempdir")
. Однако эти файлы не видны веб-контексту (т. Е. Вы не можете опубликовать простой URL-адрес для доставки этих файлов), и эти файлы никоим образом не гарантируют выживание при перезапуске веб-приложения или сервера.
Если вам просто нужно место для хранения рабочего файла в течение короткого времени, тогда это будет хорошо для вас.
Если вам действительно нужен каталог, вы можете сделать его параметром конфигурации (либо переменной среды, либо свойством Java (т. Е. java -Dyour.file.here=/tmp/files ...
), параметром контекста, заданным в web.xml, параметром конфигурации, хранящимся в вашей базе данных. через веб-форму и т. д.). Затем вам нужно установить этот каталог для развертывателя.
Однако, если вам понадобится на самом деле позднее обслуживать этот файл, вам потребуется механизм, специфичный для контейнера, для «монтирования» внешних каталогов в ваше веб-приложение (Glassfish как «альтернативные корни документа», другие имеют схожие концепции), или вам нужно написать сервлет / фильтр для обслуживания хранилища файлов за пределами вашего веб-приложения. Этот FileServlet вполне завершен, и, как вы можете видеть, создание собственного, хотя и не сложного, не так просто сделать правильно.
Edit:
Основная суть та же, но вместо использования "getRealPath", просто используйте "getInitParameter".
Итак:
String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName;
И уже в пути.
Редактировать еще раз:
Что касается содержимого пути, я бы дал ему абсолютный путь. В противном случае вам нужно ЗНАТЬ, где сервер приложений задает свой путь по умолчанию во время выполнения, и каждый сервер приложений вполне может использовать разные каталоги. Например, я считаю, что рабочий каталог для Glassfish является каталогом конфигурации работающего домена. Не особенно очевидный выбор.
Итак, используйте абсолютный путь, наиболее определенно. Таким образом, вы ЗНАЕТЕ, куда будут отправляться файлы, и можете контролировать права доступа на уровне ОС для этого каталога, если это необходимо.