Доступ к файлам JSON вне каталога проекта в clojure с использованием leiningen

Я создаю небольшое веб-приложение, используя clojure с leiningen. У меня есть определенные файлы json, к которым мне нужно получить доступ, которые я также обновляю каждую ночь, используя пакетный процесс, работающий на моем сервере. Я использую leiningen локально, но хочу развернуть uberjar на сервере. у меня есть способ либо обновить файлы json, сжатые внутри файла jar, либо получить доступ к файлам json, которые находятся за пределами uberjar. Прямо сейчас я пытаюсь сделать последнее, используя ring.util.response/resource-response в составном маршруте:

      (GET "/json/:filename" [filename] 
        (resp/resource-response 
          (str filename ".json") 
          {:root "~/internal_dashboard/app/json/"}))

Когда мое приложение пытается получить доступ к файлам, я получаю ошибку 404. Кто-нибудь знает о возможном решении?


person Sean Geoffrey Pietz    schedule 11.12.2013    source источник


Ответы (3)


JVM не расширяет ~ в путях, используйте вызов System/getenv, чтобы получить домашний каталог и построить путь.

{:root (str (System/getenv "HOME") "/internal_dashboard/app/json/")}

Tomcat часто запускается как собственный пользователь, поэтому убедитесь, что вы либо поместили его в правильный домашний каталог, либо полностью указали путь. Также может потребоваться настроить tomcat для доступа к этому каталогу.

person Arthur Ulfeldt    schedule 12.12.2013

resp/resource-response предназначен для обслуживания ресурсов, упакованных вместе с банкой, поэтому он не очень подходит для обслуживания файлов, которые необходимо обновлять отдельно от приложения.

Для вашего случая я думаю, что кольцо resp/file-response больше подходит. Это позволяет обслуживать файлы из указанного места в файловой системе, что позволяет хранить файлы json отдельно от приложения.

Что-то вроде этого:

(GET "/json/:filename" [filename] (resp/file-response
                                    (str filename ".json")
                                    {:root "/some/folder/"}))

Точное имя папки, вероятно, должно исходить из конфигурации или системной среды, как предложил Шон.

person mlni    schedule 30.12.2013

(route/files "/upload/" {:root "/path_to_your_folder/"})

http://weavejester.github.io/compojure/compojure.route.html#var-files

person Dapeng    schedule 22.08.2014