Загрузка изображения в Clojure - PullRequest
12 голосов
/ 26 ноября 2011

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

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

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

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

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

1 Ответ

14 голосов
/ 27 ноября 2011

slurp использует java.io.Reader внизу, что преобразует представление в строку, и это обычно не совместимо с двоичными данными.Ищите примеры, которые используют input-stream .В некотором смысле это может быть лучше, потому что вы можете передавать изображение из входного буфера в выходной буфер без необходимости считывать всю вещь в память.

edit

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

(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[] [B@15671adf>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...