我在使用Clojure下载图片时遇到问题,以下代码的工作方式似乎存在问题: -
(defn download-image [url filename]
(->> (slurp url) (spit filename)))
这会将文件“下载”到我指定的位置,但是我试图打开它的任何图像应用程序都无法读取该文件(例如,尝试在Web浏览器中打开它只是返回一个空白页面,尝试在预览中打开它(osx)说它是一个损坏的文件)
我认为这可能是因为slurp
应该只用于文本文件而不是二进制文件
有人能指出我正确的方向让我的代码正常工作吗?任何帮助将不胜感激!
答案 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>