实现微信小程序预览文件,预览页面添加倒计时

这篇具有很好参考价值的文章主要介绍了实现微信小程序预览文件,预览页面添加倒计时。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

提示:1、实现小程序预览doc、docx、xls、xlsx、ppt、pptx、pdf类型文件

           2、进入页面展示文件内容、开始按钮,点击,按钮变为【(**s)】倒计时

           3、倒计时结束后,此按钮消失,弹出显示【完成】,弹框保留2s后小时,用户继续阅读

例如:项目场景:示例:学习计时


问题描述

提示:小程序自带的api可以实现文件预览,但不可以在文件预览页面添加按钮,不可以操作文件预览页面:

例如:小程序文档地址:wx.openDocument(Object object) | 微信开放文档
小程序代码:


wx.downloadFile({
  // 示例 url,并非真实存在
  url: 'http://example.com/somefile.pdf',
  success: function (res) {
    const filePath = res.tempFilePath
    wx.openDocument({
      filePath: filePath,
      success: function (res) {
        console.log('打开文档成功')
      }
    })
  }
})

分析:

提示:考虑建立新页面,用web-view组件放预览文件,cover-image组件做按钮,但存在兼容性问题,部分手机cover-image组件被web-view遮挡。


解决方案:

提示:前端将预览的html文件(包括倒计时操作),放在服务器,后端用kkfileview部署获取预览地址给前端【kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等,官网地址:https://kkfileview.keking.cn/zh-cn/docs/config.html】

小程序端:

fileUrl为服务器文件地址 :'https://******.com/fileRead.html?id='+this.data.id+'&userId='+res.data.id

<web-view style="width: 100px !important;height: 200px !important;" src="{{fileUrl}}" bindload="successLoad">
</web-view>


服务器fileRead.html文件:文章来源地址https://www.toymoban.com/news/detail-539027.html

<!DOCTYPE html>
<html lang="en">

<head>
  <link rel="shortcut icon" href="#" />
  <meta charset="UTF-8" />

  <meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="expires" content="0" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
  <style>
    body {
      margin: 0;
      padding: 0;
    }

    .btn_read {
      position: absolute;

      display: none;
      right: 0;
      left: 50%;
      bottom: 30px;
      transform: translateX(-50%);
      width: 150px;
      height: auto;
      z-index: 9999;
    }

    .text-box {
      position: absolute;
      display: none;
      right: 0;
      left: 50%;
      bottom: 30px;
      transform: translateX(-50%);
      z-index: 9999;
      width: 130px;
      height: 40px;
      line-height: 40px;
      border-radius: 8px;
      border: 1px #B11818 solid;
      color: #B11818;
      font-size: 15px;
      font-weight: bold;
      text-align: center;
    }

    .box {
      position: absolute;
      display: none;

    }

    .finish-box {
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      width: 143px;
      height: auto;
      z-index: 9999;


    }
  </style>
</head>
<script>
  //可以将查找标签节点的操作进行简化 var btn = getElementById('btn')
  function $(id) {
    return document.getElementById(id);
  }
  //设置iframe自适应
  function changeFrameHeight() {
    var ifm1 = $("myiframe");
    ifm1.height = document.documentElement.clientHeight + 'px';
    ifm1.width = document.documentElement.clientWidth + 'px';
  }
  //key(需要检索的键) url(传入的需要分割的url地址,例:?id=2&age=18)
  function getSearchString(key, Url) {
    var str = Url;
    str = str.substring(1, str.length); // 获取URL中?之后的字符(去掉第一位的问号)
    // 以&分隔字符串,获得类似name=xiaoli这样的元素数组
    var arr = str.split("&");
    var obj = new Object();
    // 将每一个数组元素以=分隔并赋给obj对象
    for (var i = 0; i < arr.length; i++) {
      var tmp_arr = arr[i].split("=");
      obj[decodeURIComponent(tmp_arr[0])] = decodeURIComponent(tmp_arr[1]);
    }
    return obj[key];
  }
</script>

<body id="id_body" style="height: 100vh;width: 100%; overflow-y: hidden">
  <iframe id="myiframe" name="myiframe"></iframe>
  <img src="开始学习图片" id="btn_start" class="btn_read" />
  <div id="text_count" class=" text-box">学习中</div>
  <img id="icon_finish_bg" class="box finish-box" src="完成学习图片"></img>
  <script>
    console.log('time',new Date())
    var timer = null; //timer变量记录定时器setInterval的返回值
    var search = window.location.search;//地址参数,传入的需要分割的url地址,例:?id=2&age=18
    var fileId = getSearchString("id", search); //文件id
    var userId = getSearchString("userId", search);
    var baseUrl = '接口请求地址'
    var loading = false
    var learnDuration = 0 //学习时间,接口返回

    //监听窗口分辨率改变
    window.onresize = function () {
      changeFrameHeight();
    }
    window.onload = function () {
      changeFrameHeight();
      //开始阅读监听
      $("btn_start").addEventListener("click", function () {
        $("btn_start").setAttribute("style", "display:none");
        $("text_count").setAttribute("style", "display:block");
        countTime(learnDuration)
      });
      $("myiframe").onload = function (e) {
        console.log('myiframe加载成功');
        loading = true
        var ifDoc = $("myiframe").contentDocument || {};
        var ifTitle = ifDoc.title || '';
        console.log('ifTitle', ifTitle);
        if (ifTitle.indexOf("404") >= 0 || ifTitle.indexOf("错误") >= 0) {
          console.log('加载失败');

        }
      }
      getDetail()

    };
    //请求接口获取详情
    function getDetail() {
      $("btn_start").setAttribute("style", "display:block");
      var url = baseUrl + '/courseware/textbooks/detail/' + fileId
      var xhr = new XMLHttpRequest();
      // 可以设置请求头,一般不设置
      //超时设置 2s 设置
      xhr.timeout = 50000;
      //超时回调
      xhr.ontimeout = function () {
        // alert("网络异常, 请稍后重试!!");
      }
      //网络异常回调
      xhr.onerror = function () {
        // alert("你的网络似乎出了一些问题!");
      }
      //设置响应体数据的类型
      xhr.responseType = 'json';
      xhr.open("get", url);
      xhr.send(null);
      //注册相关事件回调处理函数
      xhr.onload = function (e) {
        if (xhr.status == 200 || xhr.status == 304) {
          if (xhr.status == 200 && xhr.response && xhr.response.code == 200) {
            loadPage(xhr.response.data)
          } else {
            console.log("Request was unsuccessful: " + xhr.status); // 请求失败,返回 响应的 HTTP 状态 
          }
        }
      };
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {// (整个数据传输过程结束)

        }
      };
    }
    //加载页面
    function loadPage(res) {
      if (!res) {
        return false;
      }
      if (!res.textbooks) {
        return false;
      }

      document.title = res.textbooks ? res.textbooks.name : ''//修改html标题
      learnDuration = res.learnDuration//获取倒计时时间
      var base64_url = base64_encode(res.textbooks.url)
      var url = encodeURIComponent(base64_url)
      console.log("base64_url", base64_url);
      console.log("url", url);
      var fileUrl = '预览文件服务端地址/onlinePreview?url=' + url + '&officePreviewType=' + res.suffix; //要预览文件的访问地址,后端使用kkfileview后的地址
      $("myiframe").src = fileUrl
      $("text_count").innerHTML = '学习中(' + res.learnDuration + "s)";
      console.log('fileUrl', fileUrl);

    }
   
//结束学习
   function finishComplete(params) {
    var api = baseUrl + '/courseware/learn/complete?id=' + fileId + '&userId=' + userId
      var xhr2 = new XMLHttpRequest();
      // 可以设置请求头,一般不设置
      //超时设置 2s 设置
      xhr2.timeout = 50000;
      //超时回调
      xhr2.ontimeout = function () {
        alert("网络异常, 请稍后重试!!");
      }
      //网络异常回调
      xhr2.onerror = function () {
        alert("你的网络似乎出了一些问题!");
      }
      //设置响应体数据的类型
      xhr2.responseType = 'json';
      xhr2.open("get", api);
      xhr2.send(null);
      //注册相关事件回调处理函数
      xhr2.onload = function (e) {
        if (xhr2.status == 200 || xhr2.status == 304) {
          if (xhr2.status == 200 && xhr2.response && xhr2.response.code == 200) {
          } else {
            console.log("Request /courseware/learn/complete was unsuccessful: " + xhr2.status); // 请求失败,返回 响应的 HTTP 状态 
          }
        }
      };
    
   }
    function countTime(count) {
      //点击开始建 开始计数
      timer = setInterval(function () {
        count--;
        if (count==0) {
          finishComplete()
        }
        if (count < 0) {
          clearInterval(timer);
          $("id_body").removeChild($("text_count"));
          $("icon_finish_bg").setAttribute("style", "display:block");
          setTimeout(function () {
        
            $("icon_finish_bg").setAttribute("style", "display:none");
          }, 2000)

        } else {
          // submitSutdy()
          $("text_count").innerHTML = '学习中(' + count + "s)";
        }
        // 需要改变页面上时分秒的值
      }, 1000);
    }



    function base64_encode(str) {
      //下面是64个基本的编码
      var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var out, i, len;
      var c1, c2, c3;
      len = str.length;
      i = 0;
      out = "";
      while (i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if (i == len) {
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt((c1 & 0x3) << 4);
          out += "==";
          break;
        }
        c2 = str.charCodeAt(i++);
        if (i == len) {
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
          out += base64EncodeChars.charAt((c2 & 0xF) << 2);
          out += "=";
          break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
      }
      return out;
    }
 </script>
</body>

</html>

到了这里,关于实现微信小程序预览文件,预览页面添加倒计时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序点击图片放大预览,新页面中全屏预览图片

    第一步:在wxml中定义image组件,并设置绑定事件。 第二步:在js中设置需要预览图片的URL数组, 切记一定要是数组 ,即使一张图也要是数组,不能直接字符串赋值。 2.1 data数据设置 2.2 绑定事件函数编制 3.wx.previewImage组件官方调用指南 4、效果预览

    2024年02月11日
    浏览(47)
  • 微信小程序实现给一个时间去设置倒计时

    设置倒计时 此方法仅限不超过一个月的倒计时

    2024年02月11日
    浏览(53)
  • 微信小程序实现倒计时功能,一看就懂,直接用

    结构完整,直接用就可以

    2024年02月01日
    浏览(45)
  • uniapp实现h5、app、微信小程序三端pdf文件下载和预览

    以下代码兼容三端,app,h5,微信小程序,经过个人测试 手机端有两种方法,使用renderjs或者uniapp的api 两者的区别 使用renderjs的写法,会提示用户是否下载文件,下载完成后用户需要手动点击下载的文件,才会打开文件 使用uniapp的api则可以直接下载并直接预览,不需要用户操

    2024年02月11日
    浏览(31)
  • uniapp —— 微信小程序预览文件

    1.问题:但是内置方法一般使用的是url预览,如果接口返回的是文件流,前端如何处理 uni.downloadFile uni.openDocument 2.解决:后端接口路径拼接,如果使用的是PC端下载文件的接口,但接口返回的是文件流,可以将地址进行拼接,放到uni.downloadFile中的url中 3.tip:网上的其他办法,

    2024年02月12日
    浏览(46)
  • 微信小程序文件预览和下载-文件系统

    文件预览和下载 在下载之前,我们得先调用接口获取文件下载的 url 然后通过 wx.downloadFile 将下载文件资源到本地 tempFilePath 就是临时临时文件路径。 通过 wx.openDocument 打开文件。 showMenu 表示预览文件右上方的菜单,你可以在该菜单中选择保存文件,将文件显示的保存到本地

    2024年02月04日
    浏览(33)
  • 微信小程序,下载流文件并打开预览

      gopdf(e){     let that=this;     let pdfurl=e.currentTarget.dataset.pdfurl;     let file;     let tokenresult = wx.getStorageSync(\\\"tokenresult\\\");          console.log(pdfurl);     wx.request({       url:app.globalData.api.fileurl + `api/file/pdf/httppreview?httpfile=${pdfurl}`,       method: \\\"GET\\\",     

    2024年02月10日
    浏览(36)
  • 微信小程序预览二进制流文件

    在线预览doc/xls/xlsx/ppt/txt/pdf 的文件和图片。 将后台返回的二进制流,写入微信的文件管理器。 打开文件。 wx.openDoucument不支持预览txt文件。 原本都是调用这个方法,根据isTxt判断是否为文本文件做不同的操作。在安卓真机调试发现打开失败,说找不到路径。 缩略图预览(增

    2024年02月09日
    浏览(39)
  • 微信小程序上传文件及图片(可以预览)

    最近在写小程序项目,碰到了一个需求,需要用户可以上传各种类型的文件和图片,展示在页面上,并且点击还可以进行预览,就找了找微信小程序官网,写了一个例子,分享一下 直接看代码: wxml: wxss: js: 有问题和建议欢迎大家留言

    2024年02月12日
    浏览(33)
  • 【微信小程序-原生开发】实用教程02-添加全局页面配置、页面、底部导航

    开始前,请先完成项目创建,详见 【微信小程序-原生开发】实用教程01-注册登录账号,获取 AppID、下载安装开发工具、创建项目、上传体验 因我们的项目是根据模板创建的,需先清理掉无效的页面代码,具体操作方式如下: 删除 pages 文件夹下的所有文件 用下方代码替换掉

    2023年04月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包