Декодирование файла в кодировке base64 обратно в исходный формат с использованием Clojure - PullRequest
2 голосов
/ 22 августа 2011

Как преобразовать файл, закодированный в base64, обратно в исходный формат и записать его на диск? Например, у меня есть файл PDF, который был закодирован в mime64. Файл начинается с:

data:application/pdf;base64,JVBER

Я бы хотел записать это на диск в правильном формате. Я пробовал несколько библиотек (например, ring.util.codec), которые декодируют строку в байтовый массив, но если я записываю полученный байтовый массив в файл (используя spit), файл кажется поврежденным.

UPDATE:

PHP-функция base64_decode, кажется, делает то, что я ищу, так как она возвращает строку. Что эквивалентно в Java?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2016

В Clojure есть data.codec (ранее в clojure-contrib).

Использование взаимодействия Java:

Так что это вспомогательные функции, которые я использовал для изображений при использовании data.codec:

(require '[clojure.data.codec.base64 :as b64-codec])

(defn write-img! [id b64]
  (clojure.java.io/copy
   (decode-str (chop-header b64))
   (java.io.File. (str "/Users/nha/tmp/" id "." (b64-ext b64)))))

(defn decode-str [s]
  (b64-codec/decode (.getBytes s)))

(defn in?
  "true if the seq coll contains the element el"
  [coll el]
  (some #(= el %) coll))

(defn b64-ext [s]
  (if-let [ext (second (first (re-seq #"data:image/(.*);base64.*" s)))]
    (if (in? ["png" "jpeg"] ext)
      ext
      (throw (Exception. (str "Unsupported extension found for image " ext))))
    (throw (Exception. (str "No extension found for image " s)))))

(defn chop-header [s]
  (nth (first (re-seq #"(data:image/.*;base64,)(.*)" s)) 2))
2 голосов
/ 22 августа 2011

Любая библиотека java должна работать (вот one от Apache Commons, вот полностью в Clojure от Clojure-contrib

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

Первым шагом может быть проверка наличия у вас точно такого же количества байтов вфайл на стороне сервера и файл, который вы пытаетесь прочитать. Кроме того, попробуйте подтвердить, что контрольная сумма (MD5) одинакова.

В любом случае файл PDF является двоичным файлом, поэтому вам следуетНЕ конвертируйте его в строку где угодно, но в прямые байты.

...