gpt4 book ai didi

clojure - 我如何确定正确的文件系统路径

转载 作者:行者123 更新时间:2023-12-01 05:42:47 25 4
gpt4 key购买 nike

我正在开发一个应用程序,它必须下载一些外部资源并通过 public/static 访问它们。 Ring 中的目录。

但是..我在将资源保存到我的应用程序的静态目录中时遇到问题,在开发时我使用 ring-jetty-adapter ;测试和生产服务器正在运行 Tomcat。

我加了 :web-content "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))))))

如果我从 REPL 启动 Jetty 并使用 savepath: "public/my.file" ,下载的文件正确放置在 public目录。
但是当我使用 .war 部署它时文件到 Tomcat,它会查找 public目录在 Tomcat 根目录中,而不是在应用程序上下文路径下。

我试图添加一个中间件包装器来确定上下文路径并从那里构建正确的保存路径,但我找不到任何方法来访问 HttpServlet或者确定应用程序是在适配器中运行还是在特定上下文中部署的方法。

这里的包装:
(defn wrap-context-info [handler]
(fn [req]
(let [resp (handler req)]
(assoc resp :servlet (:servlet req) :req (:servlet-request req)))))

两者 :servlet:reqnil .

最佳答案

看着ring-servlet source ,似乎环 servlet 适配器关联了 HttpServlet , HttpServletRequest , 和 HttpServletResponse具有环请求映射的对象在 :servlet 下, :servlet-request , 和 :servlet-response键,相应地。

它还添加了 :servlet-context值为 (.getServletContext servlet) 的请求映射条目为了方便。

在您的处理程序中,您可能希望检查请求映射中是否存在这些键,然后从关联的对象中提取您需要的更多信息。

关于clojure - 我如何确定正确的文件系统路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4284318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com