在Clojure中下载图像

在Clojure中下载图像,clojure,Clojure,我在使用Clojure下载图像时遇到问题,以下代码的工作方式似乎存在问题:- (defn download-image [url filename] (->> (slurp url) (spit filename))) 这会将文件“下载”到我指定的位置,但我尝试使用的任何图像应用程序都无法读取该文件(例如,尝试在web浏览器中打开该文件时只返回一个空白页,尝试在预览(osx)中打开该文件时表示该文件已损坏) 我想这可能是因为slurp应该只用于文本文件,而不是二进制文件 有

我在使用Clojure下载图像时遇到问题,以下代码的工作方式似乎存在问题:-

(defn download-image [url filename]
    (->> (slurp url) (spit filename)))
这会将文件“下载”到我指定的位置,但我尝试使用的任何图像应用程序都无法读取该文件(例如,尝试在web浏览器中打开该文件时只返回一个空白页,尝试在预览(osx)中打开该文件时表示该文件已损坏)

我想这可能是因为
slurp
应该只用于文本文件,而不是二进制文件


有人能给我指出代码正常工作的正确方向吗?任何帮助都将不胜感激

slurp在下面使用
java.io.Reader
,它将表示转换为字符串,这通常与二进制数据不兼容。寻找使用的例子。在某些方面,这可能更好,因为您可以将图像从输入缓冲区传输到输出缓冲区,而无需将整个内容读入内存

编辑

因为人们似乎偶尔会发现这个问题,我需要再次重写这段代码。我想我应该加一个例子。注意,这不会流式传输数据,而是将数据收集到内存中并返回一个字节数组

(require '[clojure.java.io :as io])

(defn blurp [f]
  (let [dest (java.io.ByteArrayOutputStream.)]
    (with-open [src (io/input-stream f)]
      (io/copy src dest))
    (.toByteArray dest)))
测试

(use 'clojure.test)

(deftest blurp-test
  (testing "basic operation"
    (let [src (java.io.ByteArrayInputStream. (.getBytes "foo" "utf-8"))]
      (is (= "foo" (-> (blurp src) (String. "utf-8")))))))
例如

user=> (blurp "http://www.lisperati.com/lisplogo_256.png")
#<byte[] [B@15671adf>
user=>(模糊)http://www.lisperati.com/lisplogo_256.png")
#