3

我已经成功地使用 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 数据?

4

1 回答 1

0

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

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

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

现在照片可以正确导入。

于 2013-10-03T19:38:53.773 回答