Python 正在导入 Vcard 照片
Python importing Vcard Photo
我正在尝试使用 vobject 将照片导入我的名片。我将图像存储在我的静态文件夹中,将文件名存储在我的数据库中。我想将它导入我的 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())
但我的电子名片中显然没有显示图像。我试过写完整的路径,但也没有用。提前致谢
看起来您正在将字符串 '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...........
我在 OSx 上的 Contacts v12.0 中打开了它,它呈现了我的样本图像:
我正在尝试使用 vobject 将照片导入我的名片。我将图像存储在我的静态文件夹中,将文件名存储在我的数据库中。我想将它导入我的 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())
但我的电子名片中显然没有显示图像。我试过写完整的路径,但也没有用。提前致谢
看起来您正在将字符串 '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...........
我在 OSx 上的 Contacts v12.0 中打开了它,它呈现了我的样本图像: