当前位置: 主页 > 网络资讯 > 小程序

微信或手机浏览器在线显示office文件(已测试ios、android)

发布时间:2017-01-17 14:21   浏览次数:次   作者:网络

最近开发微信企业号,发现微信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();
  //转换成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";
 }
  
 }


# 转换成  # 不需要  # 自己的  # 的是  # 客服  # 股份有限公司  # 中文网  # 不支持  # 解决方法  # 是否存在  # 云飞  # 包含了  # 腾讯  # 中有  # 设备类型  # 相关文章  # 不存在  # 解决问题  # 第三方  # 转成 


相关栏目: 【 网站优化84359 】 【 站长学院75356 】 【 运营推广7218 】 【 小程序18188 】 【 运维技术36808 】 【 营销推广32536 】 【 SEO优化41416 】 【 百度推广27695 】 【 AI推广83940


相关推荐: 探讨Golang框架的安全设计原则  malloc函数的用法和功能能  关于微信支付小程序v3【附PHP完整后端代码】  服务号和小程序的区别是什么  golang框架的安全性考虑:如何处理敏感数据?  golang框架如何支持零信任模型?  什么是 Python GIL?它是如何运作的?  浅谈小程序中怎么创建页面二维码  小程序如何自定义tabbar组件,实现底部tab切换  微信开发html5轻游戏中的几个坑  C++ 函数的单元测试与覆盖率  微信小程序 简单DEMO布局,逻辑,样式的练习  PHP 函数如何与外部 API 扩展?  PHP 函数根据稳定性如何分类?  C++ 内置函数的拓展应用和自定义案例  C++ 自身函数在云计算环境下的适用性如何?  unordered_map默认值  小程序怎么查看base64图片  unordered_map  PHP 函数扩展如何促进团队协作?  小程序开发用什么编程语言  C++ 函数库与标准模板库的应用场景有哪些?  如何解决小程序新版本覆盖率慢的问题  微力微营销,教你微商客源怎么去找,怎么让货更好卖!  总结分享一些小程序开发中实用的小知识  PHP 函数按兼容性如何分类?  总结几点小程序开发技巧  继微信小程序后,支付宝小程序也来啦!  详解微信小程序中如何安装和引用ECharts?  PHP 函数如何跨平台扩展?  如何提升Golang框架的安全性  PHP 函数按是否可以被重写如何分类?  什么是微信外挂  微信h5页面是什么  SageMath 安装  printf输出格式顺序  C++ 函数重载和 lambda 表达式的结合  printf输出双精度格式  golang框架性能优化常用的工具有哪些?  如何使用wrk2对golang框架进行性能测试?  C++ 函数库与标准模板库在容器管理中的最佳实践  printf格式什么意思  C++ 函数库与标准模板库对代码复用性的影响  微信小程序开发需要掌握哪些技术  C#微信公众号开发--网页授权(oauth2.0)获取用户基本信息一  如何在小程序页面内进行转发操作  小程序中的tabbar组件不显示是什么原因  微商应该怎样推广?  printf输出怎么用逗号隔开  微信小程序 教程之模板