gpt4 book ai didi

clojure - 在 Clojure 中下载图像

转载 作者:行者123 更新时间:2023-12-04 00:57:05 30 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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>

关于clojure - 在 Clojure 中下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8281082/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com