2011-08-21 7 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)이 있습니다.

사용하여 자바 상호 운용성 :

Java8와

그래서 ose는 이미지를 사용할 때 사용하는 도우미 함수입니다. 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

모든 자바 라이브러리가 여기에 아파치 코 몬즈에서, one입니다 (작동해야합니다, 여기에 내가이 내용이 어떤 인코딩을 사용하여 문자열로 변환 할 수있다 바이트를 의미, 어떻게 든 수정하고 노력하고 의심 Clojure-contrib

에서 완전히 Clojure의 하나있어 다른 인코딩을 사용하여이 문자열을 바이트로 다시 읽으십시오.

첫 번째 단계는 서버 측 파일의 파일과 읽는 파일의 바이트 수가 정확히 같은지 확인하는 것입니다. 또한 체크섬 (MD5)이 같은지 확인하십시오.

어쨌든 PDF 파일은 이진 파일이므로 어디서나 스트링으로 변환해서는 안됩니다.

+0

파일의 무결성을 검사했지만 손상되지 않았습니다. 또한 PHP base64_decode 함수를 사용하여 문제없이 변환 할 수 있습니다. – mac

+0

원시 바이트를 어딘가에서 사용할 수있게 할 수 있습니까? –

+0

나는 그것을 해결했다. 분명히 datauri 헤더가 디코딩을 엉망으로 만들고있었습니다. 헤더 "data : application/pdf; base64"를 잘라 내면 작동합니다. – mac

관련 문제