6

我正在使用 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"))

目前的尝试似乎与使用 slurp 遭遇同样的命运,我可以在其中回显内容字符串及其编码字符串,但是当我将内容类型更改为 image/jpeg 时,它是一个损坏的图像。

昨天我花了一整天的时间在 Google 上搜索,但没有一个示例实现了相同的目标,虽然它们帮助我了解了更多关于 Java IO 的知识,但它们还不够清楚,无法帮助我找到需要去的地方,或者生成了我已经得到了相同的结果(例如:将文件内容读入 Clojure 中的集合的最佳方法)。

(如果你能告诉我如何从文件路径中获取内容类型,那是我的下一个问题!)

4

1 回答 1

7

只要让身体成为(io/file filepath)- Ring 非常乐意为您提供文件。

编辑奖励积分:您可以使用ring.middleware.file-info/wrap-file-info来获取您返回的文件的文件元数据。或者,您可以只使用 提供整个目录(compojure.route/files "/public"),这会为您解决所有这些问题。

于 2012-07-06T19:29:56.743 回答