2011-08-21 128 views
2

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

data:application/pdf;base64,JVBER 

我想写出适当的格式的磁盘到磁盘。我已经尝试了几个将字符串解码成字节数组的库(例如ring.util.codec),但是如果我将生成的字节数组写入文件(使用spit),该文件就会损坏。

UPDATE:

PHP函数BASE64_DECODE似乎是做什么,我期待的,因为它返回一个字符串。 Java中的等效物是什么?

+0

你看互联网的base64工具吗?或者在Linux中搜索了你的软件包仓库? –

+2

http://stackoverflow.com/questions/469695/decode-base64-data-in-java –

+1

我有,我也读过上面引用的问题。我可以将字符串解码为byte.array,但是如何将内容转换为原始文件格式? – mac

回答

2

在Clojure中,有data.codec(以前在clojure-contrib中)。

使用Java的互操作性:

因此th使用data.codec当OSE是我用图像辅助功能:

(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的风景,这里从Clojure-contrib

是一个完全用Clojure我怀疑的内容以某种方式修改,使用一些编码意味着字节可以被转换成字符串,然后尝试使用不同的编码将此字符串读回字节

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

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

+0

我没有检查文件的完整性,它没有被损坏。它也可以使用PHP base64_decode函数进行转换,没有任何问题。 – mac

+0

你可以让原始字节可用吗? –

+0

我解决了它。显然datauri头部搞乱了解码。如果我切断标题“data:application/pdf; base64”,它就可以工作。 – mac