最近开发微信企业号,发现微信andriod版内置浏览器在打开文件方面有问题,但是ios版没有问题,原因是ios版使用的是safari浏览器 支持文档直接打开,但是andriod版使用的是腾讯浏览器x5内核,不知道什么原因不支持,可能是集成出现的问题,这里提供解决方法,这种方法也同样适用手机浏览器或者安卓开发。通过此方法可以在微信上开发自己的第三方应用,或者解决自己的项目问题,解决方法及核心代码如下:
1、判断浏览器类型
HttpServletRequest req = ServletAction Context.getRequest(); String userAgent=req.getHeader( User-Agent //里面包含了设备类型
2、IOS版直接使用流输出
Andriod版利用openoffice+jod转换成html,然后对html内容重新编辑,文件中有图片的将路径改为网络路径或者采用流输出(改成网络路径注意特殊符号,如+号会变成空格)
/** * 从OA上抓取文件 * author 牟云飞 * company 海颐软件股份有限公司 * tel 15562579597 * qq 1147417467 * team 客服产品中心/于洋 * @return public String getFileFromOa(){ HttpServletRequest req = ServletActionContext.getRequest(); String userAgent=req.getHeader( User-Agent //里面包含了设备类型 if(-1!=userAgent.indexOf( iPhone )){ //-----------------// //此方法需要浏览器自己能够打开,ios可以但是微信andriod版内置浏览器不支持 //-----------------// //如果是苹果手机 //获得文件地址 String fileUrl = ServletActionContext.getRequest().getParameter( fileUrl fileUrl.replaceAll( %20 , \\+ //转换加号 String strURL = MessageUtil.oaUrl+fileUrl; String fileType=strURL.substring(strURL.lastIndexOf( . )+1,strURL.length()); //获得图片的数据流 try { URL oaUrl = new URL(strURL); HttpURLConnection httpConn = (HttpURLConnection) oaUrl.openConnection(); InputStream in = httpConn.getInputStream(); //获取输出流 HttpServletResponse response = ServletActionContext.getResponse(); req.setCharacterEncoding( UTF-8 response.setCharacterEncoding( UTF-8 String name=fileUrl.substring(fileUrl.lastIndexOf( / )+1, fileUrl.length()); response.setHeader( Content-Disposition , attachment;filename= + new String( (name ).getBytes(), iso-8859-1 )); if( doc .equals(fileType)|| docx .equals(fileType)){ response.setContentType( application/msword }else if( xls .equals(fileType)|| xlsx .equals(fileType)){ response.setContentType( application/msexcel }else{ response.setContentType( application/ +fileType); OutputStream out = response.getOutputStream(); //输出图片信息 byte[] bytes = new byte[1024]; int cnt=0; while ((cnt=in.read(bytes,0,bytes.length)) != -1) { out.write(bytes, 0, cnt); out.flush(); out.close(); in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); return null; }else{ //如果非苹果手机,自己处理文档 //获得文件地址 String fileUrl = ServletActionContext.getRequest().getParameter( fileUrl fileUrl.replaceAll( %2B , \\+ //转换加号 String strURL = MessageUtil.oaUrl+fileUrl; //在本地存放OA文件,然后转换成html,再对文档中的图片路径进行修改,最后输出到页面 try { URL oaUrl = new URL(strURL); HttpURLConnection httpConn = (HttpURLConnection) oaUrl.openConnection(); InputStream in = httpConn.getInputStream(); //获取输出流 HttpServletResponse response = ServletActionContext.getResponse(); req.setCharacterEncoding( UTF-8 response.setCharacterEncoding( UTF-8 String name=fileUrl.substring(fileUrl.lastIndexOf( / )+1, fileUrl.length()); //首先判断本地是否存在 String path=req.getRealPath( path=path.substring(0, path.lastIndexOf( \\ )+1); File htmlFile=new File(path + OaFileToHtml\\ +name+ .html if(!htmlFile.exists()){ //判断文件夹是否存在,创建文件夹 String oaFilePath=path + OaFile //存放OA文档的文件夹路径; File oaFiles=new File(oaFilePath); if(!oaFiles.exists()){ //如果文件夹不存在创建文件夹 oaFiles.mkdirs(); //将OA消息存入本地 File oafile=new File(oaFiles+ File.separator +name); OutputStream out = new FileOutputStream(oafile); //输出图片信息 byte[] bytes = new byte[1024]; int cnt=0; while ((cnt=in.read(bytes,0,bytes.length)) != -1) { out.write(bytes, 0, cnt); out.flush(); out.close(); in.close(); //转换成html String htmlFilePath =path + OaFileToHtml //OA文件转成html的位置 String htmlcontext=ConvertFileToHtml.toHtmlString(oafile, htmlFilePath); req.setAttribute( htmlcontext , htmlcontext); }else{ //已经存在转换成功的文档 StringBuffer htmlSb = new StringBuffer(); try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(htmlFile),Charset.forName( gb2312 ))); while (br.ready()) { htmlSb.append(br.readLine()); br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); // HTML文件字符串 String htmlStr = htmlSb.toString(); //System.out.println( htmlStr= + htmlStr); // 返回经过清洁的html文本 req.setAttribute( htmlcontext , ConvertFileToHtml.clearFormat(htmlStr, )); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); return lookfile }
-------------------将word转换成html文件,并读取内容-------------------------
此类借鉴原地址并修改jadethao.iteye.com/blog/1817738
package com.haiyisoft.wx.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.net.ConnectException; import java.nio.charset.Charset; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; * * 端口启动命令: * soffice -headless -accept= socket,port=8100;urp; * author 牟云飞 * company 海颐软件股份有限公司 * tel 15562579597 * qq 1147417467 * team 客服产品中心/于洋 public class ConvertFileToHtml { * 将word文档转换成html文档 * @param docFile 需要转换的word文档 * @param filepath 转换之后html的存放路径 * @return 转换之后的html文件 public static File convert(File docFile, String filepath) { // 创建保存html的文件 String fileName=docFile.getName(); File htmlFile = new File(filepath + / + fileName + .html // 创建Openoffice连接 OpenOfficeConnection con = new SocketOpenOfficeConnection(8100); try { // 连接 con.connect(); } catch (ConnectException e) { System.out.println( 获取OpenOffice连接失败... e.printStackTrace(); // 创建转换器 DocumentConverter converter = new OpenOfficeDocumentConverter(con); // 转换文档问html converter.convert(docFile, htmlFile); // 关闭openoffice连接 con.disconnect(); return htmlFile; * 将word转换成html文件,并且获取html文件代码。 * @param docFile 需要转换的文档 * @param filepath 文档中图片的保存位置 * @return 转换成功的html代码 public static String toHtmlString(File docFile, String filepath) { // 转换word文档 File htmlFile = convert(docFile, filepath); System.out.println(htmlFile.getAbsolutePath()); // 获取html文件流 StringBuffer htmlSb = new StringBuffer(); try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(htmlFile),Charset.forName( gb2312 ))); while (br.ready()) { htmlSb.append(br.readLine()); br.close(); // 删除临时文件 //htmlFile.delete(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); // HTML文件字符串 String htmlStr = htmlSb.toString(); //System.out.println( htmlStr= + htmlStr); // 返回经过清洁的html文本 return clearFormat(htmlStr, filepath); * 清除一些不需要的html标记 public static String clearFormat(String htmlStr, String docImgPath) { // 获取body内容的正则 String bodyReg = BODY .* /BODY Pattern bodyPattern = Pattern.compile(bodyReg); Matcher bodyMatcher = bodyPattern.matcher(htmlStr); if (bodyMatcher.find()) { // 获取BODY内容,并转化BODY标签为p htmlStr = bodyMatcher.group().replaceFirst( BODY , p ).replaceAll( /BODY , /p // 调整图片地址,这里将图片路径改为网络路径 htmlStr = htmlStr.replaceAll( IMG SRC=\ ../ , IMG SRC=\ + MessageUtil.webUrl+ /******.do?action=***); //特殊处理一下+号,因为网络传输+会变成空格,用%2B替换+号 String temp1=htmlStr.substring(htmlStr.indexOf( action=*** ), htmlStr.length()); String temp2=temp1.substring(0,temp1.indexOf( . )); String temp3=temp2.replaceAll( \\+ , %2B htmlStr=htmlStr.substring(0,htmlStr.indexOf( action=*** ))+temp3+temp1.substring(temp1.indexOf( . ), temp1.length()); // 把 P /P 转换成 /p /p 保留样式 // content = content.replaceAll( ( P)([^ ]* .*?)( \\/P ) , // p$2 /p // 把 P /P 转换成 /p /p 并删除样式 htmlStr = htmlStr.replaceAll( ( P)([^ ]*)( .*?)( \\/P ) , p$3 /p // 删除不需要的标签 htmlStr = htmlStr.replaceAll( [/]?(font|FONT|span|SPAN|xml|XML|del|DEL|ins|INS|meta|META|[ovwxpOVWXP]:\\w+)[^ ]*? , // 删除不需要的属性 htmlStr = htmlStr.replaceAll( ([^ ]*)(?:lang|LANG|class|CLASS|style|STYLE|size|SIZE|face|FACE|[ovwxpOVWXP]:\\w+)=(?: #39;[^ #39;]* #39;|\ \ [^\ \ ]*\ \ |[^ ]+)([^ ]*) , $1$2 return htmlStr; }
【相关推荐】
1. 特别推荐:“php程序员工具箱”V0.1版本下载
2. 微信小程序完整源码下载
3. 微信小程序demo:阳淘
以上就是andriod版浏览器不支持文档直接打开的解决办法的详细内容,更多请关注php中文网其它相关文章!
最佳 Windows 性能的顶级免费优化软件
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。