解析VCARD文件(vcf格式)导入QQ通讯录功能
2014-08-18 10:49
1351 查看
参考了这篇文章:
http://www.blogjava.net/sundc/archive/2008/08/04/219877.html
http://www.blogjava.net/sundc/archive/2008/08/04/219863.html
页面上传一个从QQ邮箱导出的vcard文件,格式如下:
在网上看了一些关于导出Android通讯录的例子,也是vcf格式的文件,但是格式不太一样,是类似这样的:
我在最上头放的那个链接就是解析这个格式vcf文件的。不过原理都是一样,使用正则表达式分组嘛~~感谢那位博主大大~~
我是需要这个文件里的email和name就可以了。就是FN和EMAIL这两个字段。
注意inputstream转为reader的时候的utf-8哦,不加可能会乱码。
导入成功:
http://www.blogjava.net/sundc/archive/2008/08/04/219877.html
http://www.blogjava.net/sundc/archive/2008/08/04/219863.html
页面上传一个从QQ邮箱导出的vcard文件,格式如下:
BEGIN:VCARD VERSION:3.0 EMAIL;TYPE=HOME,INTERNET,pref:marketing@cache-cache.com.cn FN:Cache Cache玩趣时尚 N:;Cache Cache玩趣时尚;;; UID:7CBFDD99-8928-3646-86AE-1913A57F3B18 END:VCARD BEGIN:VCARD VERSION:3.0 EMAIL;TYPE=HOME,INTERNET,pref:hello@creativemarketmail.com FN:Creative Market N:;Creative Market;;; UID:ACD17D48-3036-9C4F-8A51-039897733752 END:VCARD
在网上看了一些关于导出Android通讯录的例子,也是vcf格式的文件,但是格式不太一样,是类似这样的:
BEGIN:VCARD VERSION:2.1 N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89 TEL;VOICE;PREF:1-370-000-0000 PHOTO;ENCODING=BASE64;PNG:iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAAAA。。。。 END:VCARD
我在最上头放的那个链接就是解析这个格式vcf文件的。不过原理都是一样,使用正则表达式分组嘛~~感谢那位博主大大~~
我是需要这个文件里的email和name就可以了。就是FN和EMAIL这两个字段。
/** * 把VCF文件解析成bean对象 * 导入联系人 * @param in * @throws SystemException */ public List<Contact> importVCFFileContact(InputStream in) throws SystemException{ List<Contact> list = new ArrayList<Contact>(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(in,"UTF-8")); Document document = new DocumentImpl(); BufferedWriter writer = null; String line; StringBuffer bu=new StringBuffer(); while ((line = nextLine(reader)) != null) { bu.append(line+"\r\n"); } Pattern p=Pattern.compile("BEGIN:VCARD(\\r\\n)([\\s\\S\\r\\n\\.]*?)END:VCARD");//分组, Matcher m=p.matcher(bu.toString()); while(m.find()){ Contact c = new Contact(); c.setUserId(FrameworkContextUtils.getCurrentUserId()); c.setStatus(Contact.STATUS_WAIT_INVITE); String str=m.group(0); //姓名 String name=""; Pattern p1=Pattern.compile("FN:.*");//分组, Matcher m1=p1.matcher(str); while(m1.find()){ name=m1.group(0).substring(m1.group(0).indexOf("FN:")+"FN:".length()); } c.setName(name); //email String email=""; // //直接找与email格式匹配的内容。但是若email格式中有中横线-,找不到。大家可以改改正则表达式~ // Pattern p2=Pattern.compile("\\w+(\\.\\w+)*@\\w+(\\.\\w+)+");//分组, // Matcher m2=p2.matcher(str); // while(m2.find()){ // email=m2.group(0); // } if (StringUtils.isBlank(email)) { Pattern p3=Pattern.compile("EMAIL:.*");//分组, Matcher m3=p3.matcher(str); while(m3.find()){ email=m3.group(0).substring(m3.group(0).indexOf("EMAIL:")+"EMAIL:".length()); } } if (StringUtils.isBlank(email)) { Pattern p4=Pattern.compile("EMAIL;TYPE=HOME,INTERNET,pref:.*");//分组, Matcher m4=p4.matcher(str); while(m4.find()){ email=m4.group(0).substring(m4.group(0).indexOf("EMAIL;TYPE=HOME,INTERNET,pref:")+"EMAIL;TYPE=HOME,INTERNET,pref:".length()); } } c.setEmail(email); list.add(c); } reader.close(); } catch (Exception e) { LOGGER.debug(e.getMessage()); throw new SystemException("文件格式读取有错,请检查文件"); } return list; } /** * 获取文件的内容 * 以下是源码中自代的方法 * @param reader * @return * @throws IOException */ public static String nextLine(BufferedReader reader) throws IOException { String line; String nextLine; do { line = reader.readLine(); if (line == null) return null; } while (line.length() == 0); // Evolution style line folding while (line.endsWith("=")) { line = line.substring(0, line.length() - 1); line += reader.readLine(); } // RFC 2425 line folding reader.mark(1000); nextLine = reader.readLine(); if ((nextLine != null) && (nextLine.length() > 0) && ((nextLine.charAt(0) == 0x20) // white space || (nextLine.charAt(0) == 0x09))) { // tab line += nextLine.substring(1); } else { reader.reset(); } line = line.trim(); return line; }
注意inputstream转为reader的时候的utf-8哦,不加可能会乱码。
@RequestMapping(value = "vcardUpload") public String vcardUpload(HttpServletRequest request, HttpServletResponse response) throws Exception { User user = (User)request.getSession().getAttribute(SecurityConstants.SESSION_USER); request.setAttribute("user", user); UploadFile uploadFile = FileUpDownUtils.getUploadFile(request, "uploadVCF"); String fileName = uploadFile.getFileName(); File fi = uploadFile.getFile(); InputStream inputStream = new FileInputStream(fi); String message = ""; if(inputStream.available()>2097152){ message = "文件太大"; } if(fileName==null){ message = "文件错误"; } int index1 = fileName.lastIndexOf("."); int index2 = fileName.length(); String fileExt = fileName.substring(index1,index2); if (fileExt.toLowerCase().equals(".vcf")){ try { List<Contact> contacts = friendsManager.importVCFFileContact(inputStream); if(contacts==null||contacts.size()==0){ message = "导入记录0条,可能是导入文件内容格式不正确"; } else { Contact temp = null; for (Contact contact : contacts) { temp = contactManager.getByUserIdAndEmail(FrameworkContextUtils.getCurrentUserId(), contact.getEmail()); if (temp == null) { contactManager.save(contact); } else { message += "邮件地址为: " + contact.getEmail() + " 的用户已存在。"; } } message = "导入成功." + message; } } catch (Exception e) { message = "文件格式发生错误"; } } else{ message = "不是vcf文件"; } System.out.println(message); return "redirect:/member/friends/contact/all"; }
导入成功:
相关文章推荐
- [zt]如何批量导入vCard文件(.vcf)到Gmail通讯录
- java解析vcf格式文件导入导出
- CSV格式文件向安卓小米手机中导入通讯录
- 关于vcard通讯录格式解析-微信二维码解析
- 编写一个通讯录,功能与以前的诺基亚手机一样,可以通过键盘进行箭头的移动,回车进入选项,用“W”键代表手机手机左键,“backspace”键代表返回上一级。能够实现基本的人性化的增删改查及文件的导入导出
- ios-vcf格式通讯录的生成和解析(开源),支持5.0以下版本
- EXCEL通过配置导入规则,实现任意格式EXCEL文件解析
- 关于vcard通讯录格式解析
- 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据并且获取其中某列数据
- 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据
- vcf通讯录格式解析
- 通讯录VCF文件批量导入方法
- vCard(.vcf)文件批量导入Gmail联系人的快速方法
- Windows快捷方式文件格式解析
- 解析Java的Class文件格式——解析魔数和版本号
- JAR 文件揭密- 探索 JAR 文件格式的强大功能
- vc生成的各种文件格式解析
- CSV文件格式 解析csv格式的java函数
- 使用C#把dbf格式文件的数据导入到sqlserver中
- [导入]解决打开CHM格式文件出现“网页不能浏览”错误的方法