某天接到老大任务,加通讯录添加一个导出vcard 文件功能.当时就蒙了一下:什么来的?怎么没听说过.于是打开百度,GOOGLE搜了一下.哦原来子.借助万能的GOOGLE 还找到了VCARD4J 和cardme 这两个开源类库操作vcard。稍微看了一下文档,有点迷糊,E文不好,没办法,后来想想,这vcard文件看起来不算复杂。何不借助模板引擎来自己生成呢?说干就干。
在window通讯录里新建了一个联系人,反自己放进去了作小白了。
导出一个人VCARD文件,再到google gmail上导个人出来。 对比看了一下格式。winxp 通讯录导出来的是2.0的。gmail的是3.0 两种版本规范具体有多大差别有多大没仔细去看E文。
经过几小时折腾,发现winxp里通讯录用UTF-8是会出现乱码的。GMAILGBK还是UTF-8都没问题。在IPHONE(老大帮忙测试了,我这穷人可没这玩意 ,UTF-8才行,GBK有问题)。最后就用UTF-8的编码来生成文件。
Freemarker相信很多人用这东西生成静态化网页。用来生成vcard文件原理一样。只不过模板变了。
public static void createVCardFile(String templatePath, String fileName, OutputStream ops, Page<UserJobBean> page, String encode) throws Exception { Configuration cfg = new Configuration(); cfg.setClassicCompatible(true); cfg.setObjectWrapper(new DefaultObjectWrapper()); cfg.setDefaultEncoding(encode); cfg.setOutputEncoding(encode); cfg.setDirectoryForTemplateLoading(new File(templatePath)); Template template = cfg.getTemplate(fileName); //获取模板 Map map = new HashMap(); map.put("page", page); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(ops, encode)); template.process(map, out); if (out != null) { out.close(); } if (ops != null) { ops.close(); } // ops.write(bytes); } //若是 是web中点击下载记得
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
<#list page.result as job > BEGIN:VCARD VERSION:3.0 N:${job.user.lastName};${job.user.middleName} ${job.user.firstName} | ${job.user.chineseName};; FN:${job.user.middleName} ${job.user.firstName} NICKNAME:${job.user.nickName} TITLE:${job.title} ORG:${job.team.department.businessUnit.businessUnit};${job.team.department.department} TEL;TYPE=CELL:${job.user.mobile} TEL;TYPE=WORK:${job.user.extension} TEL;TYPE=WORK:${job.user.directNumber} EMAIL;TYPE=INTERNET;TYPE=WORK:${job.user.email} END:VCARD </#list>
//打完收工,vcar文件这样就生成了!