andriod版浏览器不支持文档直接打开的解决办法

互联网 17-5-16
最近开发微信企业号,发现微信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+)=(?:'[^']*'|\"\"[^\"\"]*\"\"|[^>]+)([^>]*)>","<$1$2>");    		return htmlStr;    	}  }

【相关推荐】

1. 特别推荐:“php程序员工具箱”V0.1版本下载

2. 微信小程序完整源码下载

3. 微信小程序demo:阳淘

以上就是andriod版浏览器不支持文档直接打开的解决办法的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:详解二维码登录的原理

相关资讯