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

时间:2013-10-03 19:18:49

标签: ios perl base64 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数据?

1 个答案:

答案 0 :(得分:1)

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

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

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

现在照片导入正确。