не могу добавить изображение в кодировке base64 в визитную карточку

Я успешно использовал Perl (через Embperl) для создания динамически генерируемой vCard для сотрудников, заполняя все поля, кроме фотографии. Я не могу заставить это работать, несмотря ни на что. (Код для создания vCard без фото работает нормально.)

Согласно информации, которую я могу найти в Интернете, изображение должно быть закодировано в base64 в самой vCard. Спецификация 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_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?


person Blazemonger    schedule 03.10.2013    source источник


Ответы (1)


После импорта визитной карточки в Контакты OS X и ее повторного экспорта, а затем просмотра экспортированной визитной карточки в текстовом редакторе я заметил, что первая часть изображения в кодировке base64 была там, а остальной части не было. Кодирование остановилось именно там, где в закодированной строке появился символ пробела (по-видимому, \r).

Поэтому я удалил все пробельные символы из кодировки base64 перед созданием vCard:

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

И теперь фото импортируется корректно.

person Blazemonger    schedule 03.10.2013
comment
Используйте encode_base64($jpg, ''), чтобы получить строку в кодировке base64 без пробелов. - person cjm; 04.10.2013