转换为base64时为什么图像损坏?

时间:2017-03-01 04:09:52

标签: clojure apache-commons

我正在尝试使用以下代码对图像进行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'))

2 个答案:

答案 0 :(得分:4)

首先,预计base64的规模将显着增加,但当然不会增加一倍。

我不是Clojure开发人员,但我相信问题是slurp + getBytes。不幸的是,你不能只是将文件作为字符串读取并使用.getBytes并期望获得原始文件内容,因为编码引入了各种问题。您应该直接将文件读取为bytes数组。 This SO answer表示没有这样的标准功能,但第二个答案的slurp-bytes看起来很有希望。

答案 1 :(得分:2)

请参阅本周密切相关的问答:Slurping http://foobar.mp3 that redirects to http://fizzbar.mp3 in Clojure

基本上,slurp仅适用于文本文件。

有关完整信息,请在浏览器tab the Clojure Cheatsheet中添加书签并保持打开状态。另外,请参阅特定文档for the slurp function

可以在Clojure Cookbook中找到一个很好的例子: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