我已经成功地使用Perl(通过Embperl)创建了一个动态生成的员工vCard,填充了除照片外的所有字段。无论如何我都无法使其工作。(生成不带照片的vCard的代码可以正常工作。)
根据我在网上找到的信息,图像必须在vCard本身中进行base64编码。vCard规范(我正在使用3.0版本)支持URL链接的图像,但我的iPhone不会以这种方式链接它们。因此只能使用base64。
现在,我知道base64编码是有效的,因为如果使用该代码仅显示图像...
我是否以错误的方式格式化了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数据?
encode_base64($jpg, '')
可以获取不带空格的 base64 编码字符串。 - cjm