2017-03-01 31 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の開発者ではありませんが、私は問題がaroud slurp + getBytesであると信じています。残念ながら、文字列としてファイルを読み込むだけでは、.getBytesを使用することはできず、エンコーディングによって導入されたさまざまな問題のために元のファイルの内容を取得することを期待しています。バイト配列として直接ファイルを読み込む必要があります。 This SO answerは、そのような標準的な機能はないと示唆していますが、第2の答えのslurp-bytesは私にはかなり有望です。

+0

私の誤用は確かに私の問題の原因でした。リンク先の答えによって提供される情報を使用して、私は実際の解決策を見つけることができました。ありがとう! – 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で見つけることができます:slurp` `のhttps://clojuredocs.org/clojure.java.io/input-stream

関連する問題