最近开发微信企业号,发现微信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(" ", "\+");//转换加号
    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("+", "\+");//转换加号
   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 = "";
  Pattern bodyPattern = Pattern.compile(bodyReg);
  Matcher bodyMatcher = bodyPattern.matcher(htmlStr);
  if (bodyMatcher.find()) {
   // 获取BODY内容,并转化BODY标签为p
   htmlStr = bodyMatcher.group().replaceFirst("", "");
  }

  // 调整图片地址,这里将图片路径改为网络路径
  
  htmlStr = htmlStr.replaceAll("andriod版浏览器不支持文档直接打开的解决办法转换成保留样式
  // content = content.replaceAll("(

]*>.*?)()", // "

"); // 把

转换成并删除样式 htmlStr = htmlStr.replaceAll("(

]*)(>.*?)()", "

"); // 删除不需要的标签 htmlStr = htmlStr.replaceAll("]*?>",""); // 删除不需要的属性 htmlStr = htmlStr.replaceAll("]*)(?:lang|LANG|class|CLASS|style|STYLE|size|SIZE|face|FACE|[ovwxpOVWXP]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>",""); return htmlStr; } }

登录后复制

【相关推荐】

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

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

3. 微信小程序demo:阳淘
 

以上就是andriod版浏览器不支持文档直接打开的解决办法的详细内容,更多请关注慧达安全导航其它相关文章!

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部