200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 解析VCARD文件(vcf格式)导入QQ通讯录功能

解析VCARD文件(vcf格式)导入QQ通讯录功能

时间:2018-12-26 05:35:01

相关推荐

解析VCARD文件(vcf格式)导入QQ通讯录功能

参考了这篇文章:

/sundc/archive//08/04/219877.html

/sundc/archive//08/04/219863.html

页面上传一个从QQ邮箱导出的vcard文件,格式如下:

BEGIN:VCARDVERSION:3.0EMAIL;TYPE=HOME,INTERNET,pref:marketing@cache-FN:Cache Cache玩趣时尚N:;Cache Cache玩趣时尚;;;UID:7CBFDD99-8928-3646-86AE-1913A57F3B18END:VCARDBEGIN:VCARDVERSION:3.0EMAIL;TYPE=HOME,INTERNET,pref:hello@FN:Creative MarketN:;Creative Market;;;UID:ACD17D48-3036-9C4F-8A51-039897733752END:VCARD

在网上看了一些关于导出Android通讯录的例子,也是vcf格式的文件,但是格式不太一样,是类似这样的:

BEGIN:VCARDVERSION:2.1N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89;;FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=BC=A0=E4=B8=89TEL;VOICE;PREF:1-370-000-0000PHOTO;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=pile("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=pile("FN:.*");//分组,Matcher m1=p1.matcher(str);while(m1.find()){name=m1.group(0).substring(m1.group(0).indexOf("FN:")+"FN:".length());}c.setName(name);//emailString email="";////直接找与email格式匹配的内容。但是若email格式中有中横线-,找不到。大家可以改改正则表达式~//Pattern p2=pile("\\w+(\\.\\w+)*@\\w+(\\.\\w+)+");//分组,//Matcher m2=p2.matcher(str);//while(m2.find()){// email=m2.group(0);//}if (StringUtils.isBlank(email)) {Pattern p3=pile("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=pile("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 foldingwhile (line.endsWith("=")) {line = line.substring(0, line.length() - 1);line += reader.readLine();}// RFC 2425 line foldingreader.mark(1000);nextLine = reader.readLine();if ((nextLine != null) && (nextLine.length() > 0)&& ((nextLine.charAt(0) == 0x20) // white space|| (nextLine.charAt(0) == 0x09))) { // tabline += 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";}

导入成功:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。