【问题标题】:Decoding base64 encoded file back to original format using Clojure使用 Clojure 将 base64 编码文件解码回原始格式
【发布时间】:2011-10-31 18:43:03
【问题描述】:

如何将经过 base64 编码的文件转换回其原始格式并将其写入磁盘?例如,我有一个经过 mime64 编码的 pdf 文件。文件开头为:

data:application/pdf;base64,JVBER

我想以正确的格式将其写入磁盘。我尝试了几个将字符串解码为字节数组的库(例如 ring.util.codec),但如果我将生成的字节数组写入文件(使用 spit),则文件似乎已损坏。

更新:

PHP 函数 base64_decode 似乎正在做我正在寻找的事情,因为它返回一个字符串。 Java中的等价物是什么?

【问题讨论】:

  • 您是否在 Internet 上查看过 base64 工具?或者在 Linux 中你搜索过你的包存储库吗?
  • 我有并且我也阅读了上面提到的问题。我可以将字符串解码为 byte.array,但是如何以将内容转换为原始文件格式的方式将其写入文件?

标签: clojure base64 mime-types


【解决方案1】:

在 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】:

    任何 java 库都应该可以工作(这里是 one,来自 Apache Commons,这是一个完全在 Clojure 中来自 Clojure-contrib

    我怀疑内容以某种方式被修改,这意味着字节可能会使用某种编码转换为字符串,然后尝试将此字符串读回使用不同编码的字节。

    第一步可能是检查服务器端文件中的字节数与您尝试读取的文件的字节数完全相同。 另外,尝试确认校验和(MD5)是否相同。

    在任何情况下,PDF 文件都是二进制文件,因此您不应将其转换为任何地方的字符串,而是直接字节。

    【讨论】:

    • 我确实检查了文件的完整性并且它没有被损坏。它也可以使用 PHP base64_decode 函数进行转换,没有任何问题。
    • 你能在某处提供原始字节吗?
    • 我解决了。显然 datauri 标头弄乱了解码。如果我砍掉标题“data:application/pdf;base64”,它会起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2015-09-07
    • 2018-11-22
    • 1970-01-01
    • 2012-01-07
    • 2018-12-27
    • 2015-07-14
    • 2018-06-13
    相关资源
    最近更新 更多