2010-11-26 26 views
3

Je travaille sur une application qui doit télécharger des ressources externes et les rendre accessibles via un répertoire public/statique en anneau.Comment déterminer le bon chemin du système de fichiers

Mais .. J'ai un problème pour enregistrer les ressources dans un répertoire statique dans mon application, lors du développement j'utilise l'anneau-jetty-adaptateur, les serveurs de production de test & exécutent tomcat.

I ajouté: contenu web « public » à mon projet de Leiningen et a ajouté le répertoire « public » à la racine du projet, alors j'ai une fonction de téléchargement en utilisant http agent et flux de canard:

 
(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)))))) 

Si je démarre la jetée depuis le repl et que j'utilise le savepath: "public/my.file" le fichier téléchargé est placé correctement dans le répertoire "public". Mais quand je le déploie en utilisant un fichier war sur tomcat, il cherche un répertoire "public" dans le répertoire racine de tomcat, et pas sous le chemin du contexte de l'application. J'ai essayé d'ajouter un wrapper middleware pour déterminer le chemin de contexte et à partir de là construire le chemin de sauvegarde correct, mais je ne trouve aucun moyen d'accéder au HttpServlet ou un moyen de déterminer si l'application est en cours d'exécution dans l'adaptateur ou il est déployé dans un contexte spécifique.

Voici l'emballage:

 

(defn wrap-context-info [handler] 
    (fn [req] 
    (let [resp (handler req)] 
     (assoc resp :servlet (:servlet req) :req (:servlet-request req))))) 

à la fois: servlet et: req sont nuls.

Répondre

1

En regardant le ring-servlet source, il semble que l'adaptateur de servlet anneau associe les HttpServlet, HttpServletRequest et HttpServletResponse objets avec la carte de demande d'anneau sous :servlet, :servlet-request et :servlet-response clés, en conséquence.

Il ajoute également une entrée :servlet-context à la carte de requête avec la valeur (.getServletContext servlet) pour plus de commodité.

A l'intérieur de votre gestionnaire, vous pouvez vérifier la présence de ces clés dans la mappe de requête, puis extraire les informations supplémentaires dont vous avez besoin des objets associés.

+0

bien ce que j'essaie de faire: – drankard

+0

(defn enveloppez-contexte-info [gestionnaire] (fn [req] (let [resp (req gestionnaire)] (assoc resp: servlet (: req servlet) : req (: servlet-demande req))))) – drankard

+0

servlet et req sont nil – drankard