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 データのフォーマットを間違えていますか?