ios - 无法将 base64 编码的图像添加到 vCard

标签 ios perl base64 vcf-vcard embperl

我已成功使用 Perl(通过 Embperl)为员工创建动态生成的 vCard,填充除照片以外的所有字段。无论如何我都无法正常工作。 (生成无照片 vCard 的代码工作正常。)

根据我在网上找到的信息,vCard 中的图像必须 是base64 编码的。 vCard 规范(我使用的是 3.0)支持 URL 链接的图像,但我的 iPhone 不会以这种方式链接到它们。所以它是 base64 或什么都不是。

现在,我知道 base64 编码是有效的,因为如果使用代码只显示图像...

[-
$photo = "/path/to/directory/".$employeeID.".jpg";
open($file, "<", $photo) || warn "Can't open $photo: $!\n";
#binmode $file;
$jpg = join('', <$file>);
$decoded = MIME::Base64::encode_base64($jpg);
$vcard_content  = $decoded;
-]
<img src="data:image/jpeg;base64,[+ $decoded +]">

...然后照片完美地显示在我的浏览器中。 (有人建议我在那里需要 binmode $file;,但删除它似乎对输出没有影响。)

但如果我将其包含在 vCard 中,则照片不会与其他联系人数据一起显示:

$vcard_content  = "BEGIN:VCARD\r";
$vcard_content .= "VERSION:3.0\r";
$vcard_content .= "N:".$v_last.";".$v_first.";".$v_middle.";;\r";
# etc.
$vcard_content .= "PHOTO;ENCODING=b;TYPE=JPEG:".$decoded."\r";
# etc.
$vcard_content .= "END:VCARD";

我是否以某种方式错误地格式化了 vCard 数据?

最佳答案

将 vCard 导入 OS X Contacts 并再次导出后,然后使用文本编辑器查看导出的 vCard,我注意到 base64 编码图像的第一部分在那里,但其余部分不存在。编码在编码字符串中出现空白字符(显然是 \r)的地方停止。

所以我在构建 vCard 之前从 base64 编码中删除了所有空白字符:

$decoded = MIME::Base64::encode_base64($jpg);
$decoded =~ s/\s//g;

现在照片可以正确导入了。

关于ios - 无法将 base64 编码的图像添加到 vCard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19167455/

相关文章:

iOS - 动画上显示的文本

perl - 使用 perl 和 Net::DNS 检查 DNS

java - 在 Java 和 C# 之间编码和解码 Base64 字符串

java - Base64 编码/解码问题 : decoded string is '?'

xslt - DataPower 文件传输返回 base64

ios - 更改建议语言不起作用

ios - 在 iOS 6 中没有调用 shouldAutorotateToInterfaceOrientation

ios - 钥匙串(keychain) - 它是什么?

perl - 有没有一种简单的方法可以为 perl 测试设置一个本地的、独立的 Web 服务器?

Perl - while 循环的意外结果