【问题标题】:can't add a base64-encoded image to vCard无法将 base64 编码的图像添加到 vCard
【发布时间】:2013-10-03 19:18:49
【问题描述】:

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

【问题讨论】:

    标签: ios perl base64 vcf-vcard embperl


    【解决方案1】:

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

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

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

    现在照片可以正确导入了。

    【讨论】:

    • 使用encode_base64($jpg, '') 得到一个base64 编码的字符串,没有空格。
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2022-11-30
    • 2019-02-25
    • 2016-04-13
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多