2017-03-01 1 views
1

Ich versuche, den folgenden Code zu Base64 zu verwenden, um ein Bild zu kodieren und es dann per E-Mail-Dienst eines Drittanbieters per E-Mail zu versenden.Warum ist das Image beschädigt, wenn es in base64 konvertiert wird?

(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 
) 

Das Bild wird jedoch beschädigt und seine Größe wird verdoppelt. Ich kann dies überprüfen, indem ich es per E-Mail oder spit an eine lokale Datei sende.

Was mache ich falsch?

UPDATE: Falls es nützlich ist, macht der folgende Ruby-Code, was ich oben versuchen will und schreibe seine Ausgabe in eine Datei, dann erlaubt es mir, die E-Mail wie gewünscht zu senden. (Dies ist keine Lösung, natürlich, aber ich wollte sicher sein, was ich versuche sogar möglich zu tun war die fragliche Datei verwendet wird.)

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

Antwort

3

Zu allererst signifikanten Anstieg Größe wird für Base64 erwartet, aber nicht genau verdoppelt natürlich.

Ich bin kein Clojure-Entwickler, aber ich glaube, dass das Problem slurp + getBytes ist. Leider können Sie nicht einfach die Datei als String lesen und .getBytes verwenden und erwarten, dass der ursprüngliche Inhalt der Datei aufgrund verschiedener Probleme, die durch die Kodierung entstehen, erhalten wird. Sie sollten die Datei direkt als Byte-Array lesen. This SO answer schlagen vor, es gibt keine solche Standardfunktion, aber slurp-bytes aus der zweiten Antwort sieht ziemlich vielversprechend für mich.

+0

Mein Missbrauch von 'slurp' war in der Tat die Ursache für mein Problem

Ein schönes Beispiel kann in dem Clojure-Kochbuch zu finden. Anhand der Informationen aus der Antwort, die Sie verlinkt haben, konnte ich eine funktionierende Lösung finden. Vielen Dank! – pdoherty926

1

Sehen Sie bitte diese eng verwandte Frage und Antwort von dieser Woche: Slurping http://foobar.mp3 that redirects to http://fizzbar.mp3 in Clojure

Grundsätzlich slurp ist nur für Textdateien.

Für weitere Informationen, bitte Lesezeichen und öffnen Sie in einem Browser tab the Clojure Cheatsheet. Siehe auch die spezifische Dokumentation for the slurp function. https://github.com/clojure-cookbook/clojure-cookbook/blob/master/04_local-io/4-19_handle-binary-files.asciidoc

Weitere Beispiele auf ClojureDocs gefunden werden können: https://clojuredocs.org/clojure.java.io/input-stream

Verwandte Themen