Я работаю над приложением, которое должно загрузить некоторые внешние ресурсы и сделать их доступными через общедоступный / статический каталог в кольце.
Но .. У меня проблема с сохранением ресурсов в статическом каталоге в моем приложении, при разработке я использую адаптер ring-jetty, на тестовом и производственном серверах работает tomcat.
Я добавил: web-контент "public" в мой проект leiningen и добавил каталог "public" в корень проекта, затем у меня есть функция загрузки с использованием http-agent и duck-streams:
(defn download
[file-name url]
(h/http-agent url
:handler (fn [agnt]
(let [fname file-name]
(with-open [w (d/writer fname)]
(d/copy (h/stream agnt) w))))))
Если я загружаю Jetty из repl и использую savepath: "public / my.file", загруженный файл правильно размещается в каталоге "public".
Но когда я развертываю его с помощью файла war в tomcat, он ищет «публичный» каталог в корневом каталоге tomcat, а не в пути к контексту приложения.
Я попытался добавить промежуточную оболочку для определения пути к контексту и оттуда построить правильный путь сохранения, но я не могу найти какой-либо способ доступа к HttpServlet или способ определить, работает ли приложение в адаптере или оно развернут в определенном контексте.
Вот обертка:
(defn wrap-context-info [handler]
(fn [req]
(let [resp (handler req)]
(assoc resp :servlet (:servlet req) :req (:servlet-request req)))))
оба: servlet и: req равны нулю.