Как определить правильный путь к файловой системе - PullRequest
3 голосов
/ 26 ноября 2010

Я работаю над приложением, которое должно загрузить некоторые внешние ресурсы и сделать их доступными через общедоступный / статический каталог в кольце.

Но .. У меня проблема с сохранением ресурсов в статическом каталоге в моем приложении, при разработке я использую адаптер 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 равны нулю.

1 Ответ

1 голос
/ 26 ноября 2010

Если посмотреть на источник кольцевых сервлетов , то выясняется, что адаптер кольцевых сервлетов связывает объекты HttpServlet, HttpServletRequest и HttpServletResponse с картой запроса кольца в :servlet, :servlet-request и :servlet-response, соответственно.

Также для удобства добавляется запись :servlet-context к карте запроса со значением (.getServletContext servlet).

Внутри вашего обработчика вы можете захотеть проверить наличие этих ключей на карте запросов, а затем получить необходимую информацию из связанных объектов.

...