我成功使用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数据?
答案 0 :(得分:1)
将vCard导入OS X Contacts并再次导出后,然后使用文本编辑器查看导出的vCard,我注意到base64编码图像的第一部分在那里,但其余部分没有。编码停止在编码字符串中出现空格(\r
显然)字符的位置。
所以我在构建vCard之前从base64编码中删除了所有空白字符:
$decoded = MIME::Base64::encode_base64($jpg);
$decoded =~ s/\s//g;
现在照片导入正确。