2011-08-21 63 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