Подтвердить что ты не робот

Загрузка изображения в Clojure

У меня возникли проблемы с загрузкой изображений с помощью Clojure, похоже, проблема связана с тем, как работает следующий код: -

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

Это будет "загружать" файл в указанное мной местоположение, но файл не читается никаким приложением изображения, которое я пытаюсь открыть с ним (например, попытка открыть его в веб-браузере просто возвращает пустую страницу, пытаясь открыть его в Preview (osx) говорит, что это поврежденный файл)

Я думаю, что это может быть потому, что slurp должен использоваться только для текстовых файлов, а не для двоичных файлов.

Может ли кто-нибудь указать мне в правильном направлении, чтобы мой код работал правильно? Любая помощь будет принята с благодарностью!

4b9b3361

Ответ 1

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

Test...

(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[] [[email protected]>