近期开发微信企业号,发现微信andriod版内置浏览器在打开文件方面有问题,可是ios版没有问题。原因是ios版使用的是safari浏览器 支持文档直接打开。可是andriod版使用的是腾讯浏览器x5内核。不知道什么原因不支持。可能是集成出现的问题,这里提供解决方法。这样的方法也相同适用手机浏览器或者安卓开发。

通过此方法能够在微信上开发自己的第三方应用。或者解决自己的项目问题,解决方法及核心代码例如以下:

1、推断浏览器类型

HttpServletRequest req = ServletActionContext.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();//转换成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文件,并读取内容-------------------------

此类借鉴原地址并改动http://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);// 转换文档问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标签为DIVhtmlStr = bodyMatcher.group().replaceFirst("<BODY", "<DIV").replaceAll("</BODY>", "</DIV>");}// 调整图片地址,这里将图片路径改为网络路径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>转换成</div></div>保留样式 // content = content.replaceAll("(<P)([^>]*>.*?)(<\\/P>)", // "<div$2</div>"); // 把<P></P>转换成</div></div>并删除样式 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; } }

转载于:https://www.cnblogs.com/bhlsheji/p/5207230.html

微信或手机浏览器在线显示office文件(已測试ios、android)相关推荐

  1. 微信或手机浏览器在线显示pdf文件

    问题及解决 在之前的文章中提到了如何在手机上显示office文件,这里提一下pdf文件如何在手机上展示.问题发生情况是,公司企业号会从OA系统定时获取信息,并且解析内网文章中的图片.文件,展示在微信中 ...

  2. 可以在浏览器中在线编辑office文件的扩展程序汇总

    2017年chrome插件推荐八期:可以在浏览器中在线编辑office文件的扩展程序汇总 Chrome插件推荐 2018-02-28 11:37     微软的Office应用软件是目前办公软件中使用 ...

  3. 手机浏览器只保存php文件夹,一个PHP文件搞定支付宝系列之手机网站支付(兼容微信浏览器)...

    网上的很多PHP支付宝支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入支付宝支付的带来些许帮助和借鉴意义. 在手机浏览器下打开实现效果 在微信 ...

  4. html word编辑器插件,2017年chrome插件推荐八期:可以在浏览器中在线编辑office文件的扩展程序汇总...

    开通网上MS Office文件使用Office Web Apps的浏览器.支持DOC , PPT和XLS文件. 打开使用微软的Office Web Apps的浏览器的在线Office文件.支持在线的W ...

  5. 如何在微信复制链接直接可以用浏览器打开 微信调用手机浏览器打开指定链接

    由于微信的限制,应用文件在内置浏览器中下载全部被屏蔽掉,造成很多人用微信扫描二维码下载时,界面显示一片空白,容易误导以为在下载呢 <!DOCTYPE html> <html> ...

  6. cad显示驱动程序文件已丢失或损坏_win7系统下打开AutoCAD 2014时显示驱动程序文件.hdi丢失如何解决...

    AutoCAD 2014是一款专业性很强的3D制作软件,很多win7系统用户会安装使用,不过在安装完成之后,发现打开AutoCAD 2014时就显示驱动程序文件.hdi丢失,导致AutoCAD 201 ...

  7. 下载Foxmail显示“该文件已达到200次的下载限制”的解决办法

    昨天下载存放于foxmail中转站的一本书,点击下载时出现"该文件已达到200次的下载限制,您已不能下载该文件." 其实下载次数远远未达到200次,郁闷之极!运用了包括登录Foxm ...

  8. 浏览器在线查看pdf文件 pdf.js的使用教程

    谷歌浏览器可以直接在线查看pdf,而IE内核浏览器无法在线查看,默认是下载. 这里用到的是pdf.js,不仅支持IE内核浏览器,而且兼容手机查看pdf 官网地址:http://mozilla.gith ...

  9. 在线查看office文件的两种方法word、excel、ppt文件

    目录 一.word.excel.ppt文件在线预览 二.word.excel文件转HTML 1. 使用office软件自带功能转换HTML 2. 使用文件转换API(如Zamzar)转换HTML 一. ...

最新文章

  1. 解决eclipse project前出现红色感叹号 但没有提示错误出在什么地方build path jar包也没报错...
  2. 深度学习帮助人工智能走得更远
  3. 视频清晰度、色偏以及亮度异常检测
  4. 计算机应用基础寒假作业,计算机应用基础理论试卷寒假作业.doc
  5. 数据格式转换(一)PDF转换技术
  6. c mysql 编译_MySQL编译安装之cmake
  7. php preserve keys,PHP常用的数组函数
  8. goldendb mysql_golden数据库
  9. 数据结构-图的应用-拓扑排序
  10. FRR BGP 协议分析 5 -- 路由更新(2)
  11. python数学建模|综合评价方法
  12. centos7安装并使用supervisor管理服务队列
  13. ubuntu18.04安装wine+caj阅读器
  14. python123英文字符的鲁棒_Robust Locally Weighted Regression 鲁棒局部加权回归 -R实现
  15. 基于pygame 图片多边形坐标获取
  16. 西游记中人物对应PMP项目管理中的角色分析
  17. 一线大厂解读:最懂你的推荐系统,是怎么搭建的?|菜鸟窝大数据精华公开课
  18. 数值逼近课程设计(1)——runge现象
  19. rust矿洞绳子怎么爬下_rust矿洞绳子怎么爬 | 手游网游页游攻略大全
  20. 《信号与系统》笔记 第二章

热门文章

  1. 在互联网时代如何工作得更简单
  2. Django新手需要注意的10个要点
  3. c++容器(vector|map)中使用函数指针
  4. 控制流图|圈复杂度|基本复杂度
  5. mysql for rhel7_MySQL5.7.18 for Linux7.2(二进制安装)
  6. 的稳定性 linux_Linux系统KDE桌面,打造最接近Windows的界面环境!不用才后悔
  7. L1-061 新胖子公式 (10 分)-PAT 团体程序设计天梯赛 GPLT
  8. 蓝桥杯 ADV-78 算法提高 最长单词
  9. python调用http方法_python 使用poster模块进行http方式的文件传输到服务器的方法
  10. Python异常处理 -跳过异常继续执行