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

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数据?
1个回答

0

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

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

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

现在照片已经成功导入了。


2
使用 encode_base64($jpg, '') 可以获取不带空格的 base64 编码字符串。 - cjm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接