在Clojure中下载图像

时间:2011-11-26 19:44:42

标签: clojure

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

(defn download-image [url filename]
    (->> (slurp url) (spit filename)))

这会将文件“下载”到我指定的位置,但是我试图打开它的任何图像应用程序都无法读取该文件(例如,尝试在Web浏览器中打开它只是返回一个空白页面,尝试在预览中打开它(osx)说它是一个损坏的文件)

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

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

1 个答案:

答案 0 :(得分:14)

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

编辑

由于人们似乎偶尔会发现这个问题,我需要再次重写这段代码。我以为我会添加一个例子。注意,这不会传输数据,它会将其收集到内存中并返回一个字节数组。

(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>