Я не использую Grails, но поскольку он работает поверх Servlet API, этот ответ (управление в правильном направлении) может оказаться полезным.
Сначала возьмите ручку ServletContext
. Обычно для этого вы используете метод GenericServlet
, унаследованный getServletContext()
. Затем используйте метод ServletContext#getRealPath()
для преобразования относительного веб-пути в абсолютный путь к файловой системе на локальном диске (потому что это единственный который java.io.File
достоверно понимает).
String absolutePath = getServletContext().getRealPath("albums/1");
File file = new File (absolutePath);
// ...
Если вы используете относительные пути в java.io.File
материале, то он станет относительным к текущему рабочему каталогу, который зависит от того, как вы запустили сервер, и который действительно может быть Tomcat/bin
, как вы сами испытали.
Тем не менее, есть еще одна серьезная проблема с этим подходом: если вы создадите папки в разобранном веб-приложении, они потеряются при повторном развертывании веб-приложения или даже перезапуске сервера! Скорее создайте папки вне контекста веб-приложения, по фиксированному пути где-нибудь еще в файловой системе диска. Или, если вам нужна лучшая переносимость (но более скудная информация о метаданных), лучше вместо этого сохранить ее в базе данных.