我正在使用Compojure在Clojure中创建一个静态文件服务器,我一直在从文件系统读取图像并通过Compojure路径显示该图像.
不幸的是,slurp并不能很好地处理二进制数据,而且我已经尝试过这100种不同的方法,但这是我最近的失败尝试:
(defn image-output [filepath]
(try
(let [contents (apply str (with-open [rdr (io/reader filepath)]
(into #{} (line-seq rdr))))]
{
:status 200
:headers
{
"Content-Type" "image/jpeg",
"Content-Length" "",
"Cache-Control" "",
"Expires" ""
}
:body contents
}))
(catch Exception e {:status 404})))
(defn endpoint_view [params]
(if (contains? params :bucket)
(image-output (join "/" [data_path (:bucket params) (:dir params) (:filename params)]))))
(defroutes main-routes
(GET "/view/:bucket/:dir/:filename" {params :params} (endpoint_view params))
(route/files "/")
(route/resources "/s" {:root "./public/s"})
(route/not-found "Page not found"))
Run Code Online (Sandbox Code Playgroud)
看起来这个当前的尝试遭遇与使用slurp相同的命运,在那里我可以回显内容字符串以及它和编码的字符串,但是当我将内容类型更改为image/jpeg时,它是一个破碎的图像.
我昨天花了整整一天时间进行谷歌搜索,但是没有一个例子能够达到同样的目标,虽然它们帮助我更多地了解了Java IO,但是它们还不够清晰,无法帮助我到达我需要去的地方,或者生产了我已经得到了相同的结果(例子:在Clojure中将文件内容读入集合的最佳方法).
(如果你可以告诉我如何从文件路径获取内容类型以及这是我的下一个问题,那么虚构的奖励积分!)
只需让身体成为(io/file filepath)- Ring非常乐意为您提供文件.
编辑奖励积分:您可以使用ring.middleware.file-info/wrap-file-info获取您返回的文件的文件元数据.或者,您可以只使用一个完整的目录服务(compojure.route/files "/public"),这样就可以解决所有这些问题.