2017-03-01 77 views
1

我正在嘗試使用以下代碼來base64編碼圖像,然後使用第三方電子郵件服務發送電子郵件。爲什麼轉換爲base64時圖像被破壞?

(ns application.encode 
    (:import org.apache.commons.codec.binary.Base64) 
    (:require [clojure.java.io :as io])) 

(defn encode [file-path] 
    (let [content (String. 
        (Base64/encodeBase64 
        (.getBytes 
         (slurp (clojure.java.io/resource "public/test.gif")))))] 

    ;; email file contents 
) 

但是,圖像被破壞,其大小增加了一倍。我可以通過電子郵件或spit將其發送到本地文件來驗證。

我在做什麼不正確?

更新:如果它有用,下面的Ruby代碼將執行上面的操作,並將其輸出寫入文件,然後slurp它允許我根據需要發送電子郵件。 (這不是一個解決方案,當然,但我想確保我想要做的是甚至有可能使用有問題的文件。)

encoded = Base64.encode64(File.read('resources/public/test.gif'))

回答

3

首先,在顯著上升大小預計爲base64,但當然不會完全翻倍。

我不是Clojure的開發者,但我相信問題是slurp + getBytes。不幸的是,你不能只讀取文件作爲字符串,並使用.getBytes,並期望得到原始文件的內容,因爲編碼引入的各種問題。你應該直接讀取文件作爲字節數組。 This SO answer建議沒有這樣的標準功能,但從第二個答案slurp-bytes看起來很有希望給我。

+0

我的'濫用slurp'確實是我的問題的原因。使用您鏈接的答案提供的信息,我能夠找到一個可行的解決方案。謝謝! – pdoherty926

1

請參閱此密切相關的問題和答案從本週:Slurping http://foobar.mp3 that redirects to http://fizzbar.mp3 in Clojure

基本上,slurp只能用於文本文件。

如需完整信息,請在瀏覽器中書籤並保持打開狀態tab the Clojure Cheatsheet。另請參閱具體文檔for the slurp function

一個很好的例子可以在Clojure的食譜中找到:https://github.com/clojure-cookbook/clojure-cookbook/blob/master/04_local-io/4-19_handle-binary-files.asciidoc

更多的例子可以在ClojureDocs發現:https://clojuredocs.org/clojure.java.io/input-stream