使用 Groovy 和 Apache commons 从 base64 字符串发送图像附件

Posted

技术标签:

【中文标题】使用 Groovy 和 Apache commons 从 base64 字符串发送图像附件【英文标题】:Send image attachment from base64 string using Groovy and Apache commons 【发布时间】:2017-08-05 10:45:14 【问题描述】:

我正在编写一个流程,以便在使用 Groovy 并已安装 apache.commons.mail.* 库的系统中向客户发送电子邮件(尽管如果绝对必要我可以安装其他库)。

问题是图像作为 base64 编码字符串传递给我。我考虑过将它们保存为图像,然后通过 URL (here are some examples of sending an email with attachments) 附加它们,但这似乎浪费了一个步骤来解码它们以重新编码。有没有办法直接附上图片?

我找到了 a few 其他 SO posts 和 similar questions,但他们似乎对我的情况给出了不满意的答案,或者依赖于我无法访问的其他 Java 版本/库。

编辑:

这就是我现在的状态(感谢 JerryP 对 this post 的评论):

def my_img = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQAB...";
byte[] img_bytes = b64_data.src.drop(b64_data.src.indexOf(',')+1).decodeBase64();  // This extracts the encoded part
def type = b64_data.src.substring(b64_data.src.indexOf(':') + 1, b64_data.src.indexOf(';') ); // This extracts the data type from the long base64 string (i.e. 'data:image/jpeg;base64,/9j/4AAQSkZJRgABA...')

enc_attachments = ByteArrayDataSource( img_bytes, type ); 

所以,我现在有一个 ByteArrayDataSource 我的图像,但 the embed calls in apache commons 不要将 ByteArrayDataSource 作为参数。

【问题讨论】:

【参考方案1】:

好的,我想通了。以上确实有效,我只是错过了ByteArrayDataSource之前的'new'关键字,所以当我去发送时它让我有些奇怪。所以最终的代码是这样的:

def my_img = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQAB...";
def filename = "foo.jpg";
byte[] img_bytes = my_img.drop(my_img.indexOf(',')+1).decodeBase64();  // This extracts the encoded part
def type = my_img.substring(my_img.indexOf(':') + 1, my_img.indexOf(';') ); // This extracts the data type from the long base64 string (i.e. 'data:image/jpeg;base64,/9j/4AAQSkZJRgABA...')

enc_attachment = new ByteArrayDataSource( img_bytes, type );

// ... set up email stuff here

def cid = email.embed(enc_attachment, filename);
attachment_str += '<img src="cid: ' + cid + '" />';  // email.embed() returns a random 'cid'
// put attachment_str in your message before sending in order to embed.

【讨论】:

以上是关于使用 Groovy 和 Apache commons 从 base64 字符串发送图像附件的主要内容,如果未能解决你的问题,请参考以下文章

使用Groovy和Apache XML-RPC访问SNIPPLR

Common tasks that you can perform with the Groovy Script test step

[每日一学]apache camel|BDD方式开发apache camel|Groovy|Spock

Groovy嵌入式Apache FTP服务器示例

如何在没有 IDE 的情况下使用 Apache Commons Lang 代码? (org.apache.commons.lang3)

xml Apache NiFi的模板,它使用带Groovy的ExecuteScript发出SQL查询并生成包含CSV表示的流文件o