try{
File file = File.createTempFile(uuid, ".vcf");
String filePath = file.getPath();
VcfUtil vcfUtil = new VcfUtil();
vcfUtil.exportVcf(vo,file);
BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if (isOnLine) { // 在线打开方式
URL u = new URL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("text/x-vcard");
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
out.flush();
br.close();
out.close();
}
vcf 本地生成 然后 在对方手机上下载临时文件
···
public class VcfUtil {
public void exportVcf(AddressBeanVO bean, File file) {
try {
BufferedWriter reader = new BufferedWriter(new PrintWriter(file));
// for (AddressBeanVO bean : addressBeans) {
reader.write("BEGIN:VCARD");
reader.write("\r\n");
reader.write("VERSION:3.0");
reader.write("\r\n");
reader.write("N;CHARSET=utf-8:" + bean.getTrueName() + ";;;");
reader.write("\r\n");
reader.write("TITLE;CHARSET=utf-8:Partner");
reader.write("\r\n");
reader.write("ADR;WORK;POSTAL;CHARSET=utf-8:20/F, China Resources ");
reader.write("\r\n");
reader.write("Building, 8 Jianguome");
reader.write("\r\n");
if ("" != bean.getMobile() && bean.getMobile() != null) {
reader.write("TEL;CELL:" + bean.getMobile() + "");
reader.write("\r\n");
}
if ("" != bean.getWorkMobile() && bean.getWorkMobile() != null) {
reader.write("TEL;WORK:" + bean.getWorkMobile() + "");
reader.write("\r\n");
}
if ("" != bean.getTelePhone() && bean.getTelePhone() != null) {
reader.write("TEL;HOME:" + bean.getTelePhone() + "");
reader.write("\r\n");
}
if ("" != bean.getEmail() && bean.getEmail() != null) {
reader.write("EMAIL:" + bean.getEmail() + "");
reader.write("\r\n");
}
//头像转换
if ("" != bean.getImage() && bean.getImage() != null) {
reader.write("PHOTO;ENCODING=b;TYPE=PNG:" + bean.getAvatar().replace("\r\n", "") + "");
reader.write("\r\n");
}
reader.write("END:VCARD");
reader.write("\r\n");
// }
reader.flush();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 编码
*/
public static String qpEncodeing(String str) {
char[] encode = str.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < encode.length; i++) {
if ((encode[i] >= '!') && (encode[i] <= '~') && (encode[i] != '=') && (encode[i] != '\n')) {
sb.append(encode[i]);
} else if (encode[i] == '=') {
sb.append("=3D");
} else if (encode[i] == '\n') {
sb.append("\n");
} else {
StringBuffer sbother = new StringBuffer();
sbother.append(encode[i]);
String ss = sbother.toString();
byte[] buf = null;
try {
buf = ss.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (buf.length == 3) {
for (int j = 0; j < 3; j++) {
String s16 = String.valueOf(Integer.toHexString(buf[j]));
// 抽取中文字符16进制字节的后两位,也就是=E8等号后面的两位,
// 三个代表一个中文字符
char c16_6;
char c16_7;
if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122) {
c16_6 = (char) (s16.charAt(6) - 32);
} else {
c16_6 = s16.charAt(6);
}
if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122) {
c16_7 = (char) (s16.charAt(7) - 32);
} else {
c16_7 = s16.charAt(7);
}
sb.append("=" + c16_6 + c16_7);
}
}
}
}
return sb.toString();
}
}
传输图片格式为base64 格式 去空格 去标题头