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

4

1 に答える 1

0

vCard を OS X の連絡先にインポートして再度エクスポートした後、エクスポートした vCard をテキスト エディタで表示すると、base64 でエンコードされた画像の最初の部分は存在するものの、残りの部分は存在しないことに気付きました。エンコーディングは、エンコードされた文字列に空白 (\r明らかに) 文字が現れたところで停止しました。

したがって、vCard を作成する前に、base64 エンコーディングからすべての空白文字を削除しました。

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

これで、写真が正しくインポートされます。

于 2013-10-03T19:38:53.773 に答える