2017-03-01 76 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