【问题标题】:Why is image corrupted when converted to base64?为什么转换为base64时图像损坏?
【发布时间】:2017-03-01 04:09:51
【问题描述】:

我正在尝试使用以下代码对图像进行 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 代码会执行我在上面尝试执行的操作并将其输出写入文件,然后 slurping 它允许我根据需要发送电子邮件。 (当然,这不是一个解决方案,但我想确保我正在尝试做的事情甚至可以使用有问题的文件。)

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

【问题讨论】:

    标签: clojure apache-commons


    【解决方案1】:

    请参阅本周密切相关的问题和答案: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

    【讨论】:

      【解决方案2】:

      首先,base64 的大小预计会显着增加,但当然不会完全翻倍。

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

      【讨论】:

      • 我滥用slurp 确实是我的问题的原因。使用您链接到的答案提供的信息,我能够找到一个可行的解决方案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 2015-12-09
      • 1970-01-01
      • 2019-12-03
      相关资源
      最近更新 更多