gpt4 book ai didi

clojure - 使用 compojure 从数据库提供二进制文件

转载 作者:行者123 更新时间:2023-12-04 13:21:09 24 4
gpt4 key购买 nike

我有以下路线定义:

(require '[compojure.core :as ccore]
'[ring.util.response :as response])

(def *main-routes*
(ccore/defroutes avalanche-routes
(ccore/GET "/" [] "Hello World 2")
(ccore/GET "/images/:id" [id] (get-image-response id))))

在这个例子中,请求 /像魅力一样工作并返回预期的 Hello World 2 .

get-images-response 方法定义如下:
(defn get-image-response
[id]
(let [record (db/get-image id false)]
(-> (response/response (:data record))
(response/content-type (:content-type record))
(response/header "Content-Length" (:size record)))))

不过我得到了 404,所以二进制文件的服务还不能正常工作。任何想法为什么?

编辑:
好的,这个问题与在 /images/name.jpg 上请求图像有关的事实有关。 .一旦我删除 .jpg处理程序被调用。所以问题变成了我如何匹配扩展名以外的任何东西?

最佳答案

Compojure 使用 clout用于路由匹配。点字符在影响 route 具有特殊含义。它代表一个标记分隔符,类似于斜杠字符。以下字符在 clout 中都有这个含义:/ . , ; ? .

这意味着像 "/images/:id" 这样的路由将不匹配形式为 /images/name.jpg 的 uri自 images , namejpg每个代表一个单独的代币影响力。

为了匹配它,您可以根据需要以多种不同的方式组成您的路线。

如果您所有的图片都有 .jpg扩展,最简单的方法是:

(GET "/images/:id.jpg" [id] ...)

如果扩展名不同,您可以执行以下操作:
(GET "/images/:name.:extension" [name extension] ...)

如果你想限制扩展,你可以通过 compojure/clout 一个正则表达式:
(GET ["/images/:name.:ext", :ext #"(jpe?g|png|gif)"] [name ext] ...)

您也可以使用通配符,它​​不太精确,可以匹配以 /images/ 开头的任何 uri。 :
(GET "/images/*" [*] ...)

关于clojure - 使用 compojure 从数据库提供二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988486/

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