Python импорт Vcard Photo - PullRequest
       51

Python импорт Vcard Photo

0 голосов
/ 30 апреля 2020

Я пытаюсь импортировать фотографию на мою карту, используя vobject. У меня есть изображение, хранящееся в моей папке stati c, и имя файла в моей базе данных. Я хотел бы импортировать его на мою VCard.

Пока что я сделал это:

    if request.method == "POST":
            rowr = User.query.filter_by(user_id = user_id).first()
            rowes = Profile.query.filter_by(user_id = user_id).first()
            vcf_file_path = 'static/Contacto.vcf'
            with open(vcf_file_path , 'w') as file_vcard:
                vcard = vobject.vCard()
                o = vcard.add('fn')
                o.value = rowes.pname

                if rowr.img_url != 'default.png':
                    o = vcard.add('PHOTO')
                    o.value = rowr.img_url

                if rowes.pemail != None:
                    o = vcard.add('email')
                    o.type_param = 'INTERNET'
                    o.value = rowes.pemail

                if rowes.pcellphone != None:
                    o = vcard.add('TEL')
                    o.type_param = 'Número Celular'
                    o.value = str(rowes.pcellphone)

                if rowes.webpage != None:
                    o = vcard.add('url')
                    o.type_param = "Página Web"
                    o.value = rowes.webpage

                if rowes.textarea != None:
                    o = vcard.add('note')
                    o.type_param = "note"
                    o.value = rowes.textarea

                file_vcard.write(vcard.serialize())

Но изображение на моей VCard явно не отображается. Я пытался написать весь путь, но тоже не сработало. Заранее спасибо

1 Ответ

1 голос
/ 01 мая 2020

Похоже, что вы пишете строку 'default.jpg' в поле фотографии, когда на самом деле вам нужно написать изображение в кодировке base64. Вы можете сделать это с помощью такой функции:

import base64
def b64_image(filename):
    with open(filename, 'rb') as f:
        b64 = base64.b64encode(f.read())
        return b64.decode('utf-8')

Затем вызвать ее как:

o = vcard.add('PHOTO;ENCODING=b;TYPE=image/jpeg')
o.value = b64_image('default.jpg')

Очевидно, передайте этой функции правильный путь к файлу изображения, который в вашем случае может быть rowr.img_url.

Этот формат основан на спецификации формата vCard .

При тестировании в файле vcf создается строка, которая выглядит следующим образом:

PHOTO;ENCODING=B;TYPE=IMAGE/JPEG:iVBORw0KGgoAAA...........

Я открыл это в Contacts v12.0 на OSx, и он отображает мой пример изображения:

vcard sample with working image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...