andriod版浏览器不支持文档直接打开的解决办法
最近开发微信企业号,发现微信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 海颐软件股份有限公司 * tel15562579597 * qq1147417467 * 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();//转换成htmlString 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/1817738package 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 海颐软件股份有限公司 * tel15562579597 * qq1147417467 * 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);// 转换文档问htmlconverter.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标签为phtmlStr = 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+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>","<$1$2>");return htmlStr;}}【相关推荐】
1. 特别推荐:“php程序员工具箱”V0.1版本下载
2. 微信小程序完整源码下载
3. 微信小程序demo:阳淘以上就是andriod版浏览器不支持文档直接打开的解决办法的详细内容,更多请关注小潘博客其它相关文章!