收藏
回答

企业微信JS-SDK调用wx.previewFile预览文件失败

问题类型 API/组件名称 终端类型 微信版本 基础库版本
Bug wx.previewFile 微信安卓客户端 2.8.16(11292) http://res.wx.qq.com/open/js/jweixin-1.2.0.js

1、我确定传的这三个参数是对的,然后调试时提示:"wx.previewFile is not a function"。

wx.previewFile({
                    url: '@returnUrl' + url, // 需要预览文件的地址(必填,可以使用相对路径)
                    name: name, // 需要预览文件的文件名(不填的话取url的最后部分)
                    size: size // 需要预览文件的字节大小(必填)
                });



2、但是调用预览图片这个接口时是正常的。

wx.previewImage({
                    current: '@returnUrl' + url, // 当前显示图片的http链接
                    urls: this.urlPath // 需要预览的图片http链接列表
                });

回答关注问题邀请回答
收藏

8 个回答

  • 企业微信运营专员-千夜
    企业微信运营专员-千夜
    2019-10-24

    您好,http://res.wx.qq.com/open/js/jweixin-1.2.0.js,请引用这个js,不要复制用其他url


    2019-10-24
    有用
    回复 16
    • 李明羽
      李明羽
      2019-10-29
      wx.previewFile接口,android可以正常预览文件,ios提示下载失败,检查网络
      2019-10-29
      回复
    • 企业微信运营专员-千夜
      企业微信运营专员-千夜
      2019-10-29回复李明羽
      可以看下文档哈,后面有说明ios版本的企业微信浏览器与安卓的不一样,需要配置下才可以
      2019-10-29
      回复
    • 彪哥
      彪哥
      2019-11-13回复企业微信运营专员-千夜
      文件下载地址都是公开的了,但是IOS还是提示下载失败。android的可以。这是为啥?
      2019-11-13
      回复
    • 许新帅
      许新帅
      2019-12-04回复彪哥
      解决了吗
      2019-12-04
      回复
    • ོ唔⃕ ོོ
      ོ唔⃕ ོོ
      2020-01-15回复李明羽
      大佬有没有解决了,一样的问题哇。
      2020-01-15
      回复
    查看更多(11)
  • Stuck
    Stuck
    2020-01-16

    我们项目是Vue开发的,然后iOS端预览文件也遇到了`wx.previewFile isnot a function`,Android版本没有这个问题,各种方法排查了一下最后解决了,有遇到这个问题的也可以对比着看下。记录一下自己的排查过程:

    首先报出这个错写过js的基本都知道wx这个对象里面没有这个方法,点开jweixin.js的源码搜了一下确实没有这个previewFile函数。于是跟企业微信私有化团队撕逼,你给的这个js文件确实没这个函数啊,是不是最近升级给忘了呀。然后检查了一下之前版本的企业微信上程序,基本都可以预览文件。就更确定了应该不是我们的问题,是微信团队某次升级把sdk搞坏了。微信那边也没辙,写了个最基本的demo测了一下iOS高版本企业微信发现是可以预览的,也就是无法复现这个问题。然而demo给到我们后台却没法跑起来,对接的哥们儿也开始装死了。我看了一下demo的代码,对比着各处使用也没啥不一样啊,自己写了个demo,连我们的后台试了一下,demo确实可以正常跑。OK这下子锅没得跑了。老老实实再检查,发现引入js的路子不一样。

    我用的构建工具,本地有一份微信的jssdk文件。所以为了方便本地调试,打开发包时用的是本地的js文件,打测试生产包才会用文档上给出的js url,而js文件引入的方式是用document.write()往文档流里面写,这样引入之后生成的wx对象中就会少掉一部分函数,解决方法也很简单:直接老老实实在html里面用script标签引入进去就好了。

    我不知道之前版本的企业微信为什么可以正常预览,但是2.3.X版本的企业微信确实无法预览了。个人猜测像诸如previewFile这一类的函数应该不是jssdk文件中提供的,跟平台实现有关。之前也确实看到有人讲预览文件的函数是app提供上去的,所以使用我那样的引入方式会导致previewFile这类函数绑不到wx对象上去。这也是我个人的猜测,不能保证各位的问题都跟我一样,欢迎交流吧。


    2020-01-16
    有用 2
    回复 3
    • Leander
      Leander
      2020-03-16
      跟你遇的的问题一摸一样
      2020-03-16
      2
      回复
    • 志
      2020-09-04
      我也遇到了这个问题, 就是not a function  ,按你说的在jsp里面重新引入了 也不行
      2020-09-04
      回复
    • 玖
      2021-09-27回复
      用wx.invoke委托就可以解决了
      2021-09-27
      1
      回复
  • N   _._
    N _._
    2020-04-10

    想问下文件名中有特殊字符可以吗

    2020-04-10
    有用 1
    回复 1
    • N   _._
      N _._
      2020-04-10
      安卓手机,#或者%命名的文件无法下载无法打开,空文件无法点击。
      苹果手机,空文件可点击,文件无法下载无法打开,%命名的文件不可点击
      2020-04-10
      回复
  • 😜😜
    😜😜
    2021-11-04

    我的出现的问题是previewFile能调用到,但文件预览没出来。环境是微信小程序开发工具企业微信模式(基础库有试过:2.12.13、2.10.1、2.8.3、2.4.0),安卓手机(华为mate10pro),企业微信版本是3.1.19。

    web-view HTML代码如下:

      
    
    


    lookDoc.html如下:

    
    
    地球人
    
    
    
    
    
    var fileURL;
      (function(){
        var params = location.search.substring(1).split("&");
        //alert("params:"+params);
        if(null==params||undefined==params||params.length<=0||null==params[0]||undefined==params[0]||""==params[0]||"undefined"==params[0]){
        	alert("获取不到文件地址。请返回重试!");
        	return;
        }
    	//alert("wx.previewFile:"+wx.previewFile);
        var url=decodeURIComponent(params[0]),fileName=decodeURIComponent(params[1]),reqURL=decodeURIComponent(params[4]);
    	fileURL=reqURL+"/067fd6610b564949af84eb418b4a6755.pptx";
        var reqParams={"agentId":window.location.href};
        var xhr = new XMLHttpRequest();
    	  xhr.open("POST", reqURL+"/my/loadSingnature", true);
    	  xhr.setRequestHeader("Content-type", "application/json");
    	  xhr.setRequestHeader("kbn-version", "5.3.0");
    	  xhr.setRequestHeader("c_t", params[5]);
    	  xhr.setRequestHeader("fromType", params[6]);
    	  xhr.onreadystatechange = function() {
    		  if (xhr.readyState == 4) {
    			  if (xhr.status == 200) {
    				  var str=xhr.responseText,singnature=xhr.getResponseHeader("singnature"),longTime=Number(xhr.getResponseHeader("longTime")),randomStr=xhr.getResponseHeader("randomStr");
    				  if(str.indexOf("Success")>-1){
    					  //alert(singnature+"\n"+longTime+"\n"+randomStr+"\n"+window.location.href);
    				  	window.wx.config({
    				        beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
    				        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    				        appId: params[3], // 必填,企业微信的corpID
    				        timestamp:longTime, // 必填,生成签名的时间戳
    				        nonceStr: randomStr, // 必填,生成签名的随机串
    				        signature: singnature,// 必填,签名,见 附录-JS-SDK使用权限签名算法
    				        jsApiList: ["previewFile"] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
    				    });
    				    wx.ready(function(rea){//alert("wx.ready:"+rea);
    				        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,
    						//则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    						/*alert("wx.previewFile read:"+wx.previewFile);
    						wx.checkJsApi({
    							jsApiList: ['previewFile'], // 需要检测的JS接口列表
    							success: function(res) {
    								// 以键值对的形式返回,可用的api值true,不可用为false
    								// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
    								alert("checkJsApi_res:"+res);
    							}
    						});*/
    						//pdf 126552 c60f4567b4f749389f8b224ff926400f.pdf
    						var pdfURL=reqURL+"/c60f4567b4f749389f8b224ff926400f.pdf";
    						window.wx.invoke("previewFile",{
    							url: pdfURL, // 需要预览文件的地址(必填,可以使用相对路径)
    							//name: "c60f4567b4f749389f8b224ff926400f.pdf", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名)
    							size: 126552//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败)
    						});
    						/*//doc 31742 c522e139a67246bab028a0b7898d5d05.docx
    						var docURL=reqURL+"/c522e139a67246bab028a0b7898d5d05.docx";
    						window.wx.invoke("previewFile",{
    							url: pdfURL, // 需要预览文件的地址(必填,可以使用相对路径)
    							name: "c522e139a67246bab028a0b7898d5d05.docx", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名)
    							size: 31742//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败)
    						});
    						//excel 31685 b26c51b4808e443d9979c09d5e7b4c4b.xlsx
    						var excelURL=reqURL+"/b26c51b4808e443d9979c09d5e7b4c4b.xlsx";
    						window.wx.invoke("previewFile",{
    							url: excelURL, // 需要预览文件的地址(必填,可以使用相对路径)
    							name: "b26c51b4808e443d9979c09d5e7b4c4b.xlsx", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名)
    							size: 31685//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败)
    						});
    						window.wx.invoke("previewFile",{
    							url: fileURL, // 需要预览文件的地址(必填,可以使用相对路径)
    							name: "067fd6610b564949af84eb418b4a6755.pptx", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名)
    							size: 1983995//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败)
    						});*/
    				    });
    				    wx.error(function(res){alert("wx.config error:"+res);
    				        // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    				    });
    				  }else{
    					  alert("获取企业微信JS SDK调用签名失败,无法预览!");
    				  }
    			  }
    		  }
    	  };
    	  xhr.send(stringify(reqParams));
      })();
      function stringify(jsonObj) {
          var result = '',
              curVal;
          if (jsonObj === null) {
              return String(jsonObj);
          }
          switch (typeof jsonObj) {
              case 'number':
              case 'boolean':
                  return String(jsonObj);
              case 'string':
                  return '"' + jsonObj + '"';
              case 'undefined':
              case 'function':
                  return undefined;
          }
    
          switch (Object.prototype.toString.call(jsonObj)) {
              case '[object Array]':
                  result += '[';
                  for (var i = 0, len = jsonObj.length; i < len; i++) {
                      curVal = JSON.stringify(jsonObj[i]);
                      result += (curVal === undefined ? null : curVal) + ",";
                  }
                  if (result !== '[') {
                      result = result.slice(0, -1);
                  }
                  result += ']';
                  return result;
              case '[object Date]':
                  return '"' + (jsonObj.toJSON ? jsonObj.toJSON() : jsonObj.toString()) + '"';
              case '[object RegExp]':
                  return "{}";
              case '[object Object]':
                  result += '{';
                  for (i in jsonObj) {
                      if (jsonObj.hasOwnProperty(i)) {
                          curVal = JSON.stringify(jsonObj[i]);
                          if (curVal !== undefined) {
                              result += '"' + i + '":' + curVal + ',';
                          }
                      }
                  }
                  if (result !== '{') {
                      result = result.slice(0, -1);
                  }
                  result += '}';
                  return result;
    
              case '[object String]':
                  return '"' + jsonObj.toString() + '"';
              case '[object Number]':
              case '[object Boolean]':
                  return jsonObj.toString();
          }
      }
      //document.ready(function(){
      //});
    
    
    
    
    

    开发工具:

    手机端:

    2021-11-04
    有用
    回复
  • 下雨的街道
    下雨的街道
    2020-12-07

    我是可以显示,但是文件的size显示是0B,而我打印看了,传入的size参数明明是大于0的

    2020-12-07
    有用
    回复 1
    • 下雨的街道
      下雨的街道
      2020-12-07
      ios平台,android是正常的
      2020-12-07
      回复
  • 贺瑞杰
    贺瑞杰
    2020-06-16

    我是Android不可以,苹果可以,奇了怪了,执行到wx.previewFile 就不执行了,也不报错

    2020-06-16
    有用
    回复 1
    • A
      A
      2023-04-23
      解决了吗,哥,我跟你一样的问题
      2023-04-23
      回复
  • 秋日荡离殇
    秋日荡离殇
    2019-12-14

    我用npm安装的1.4.0版本js,为啥没有previewFile接口?并且文档中,媒体分组有这个接口
    但是所有js列表中没有


    真是奇怪,不知道文档怎么写的。

    2019-12-14
    有用
    回复 1
  • lwd
    lwd
    2019-11-27

    请问解决了吗?

    2019-11-27
    有用
    回复
登录 后发表内容
问题标签