当前位置:   article > 正文

uni-app 框架建小程序跳转h5页面播放视频并下载到本地_h5下载视频

h5下载视频

一、明确目的:

1、视频的位置在h5的页面中,包含下载按钮;

2、小程序中有“播放”的按钮;

3、h5页面内嵌在小程序里面里

 二、选择组件

uni-app内嵌h5页面,用<web-view>组件;

三、实现思路

1、小程序中找到“播放”按钮,点击跳转“新页面-webview”,并传递h5页面的url地址给新页面

2、新建页面-webview,内含<web-view>标签组件

3、h5页面,播放视频,并通过uni.postMessage来传递数据信息(视频地址)

4、小程序webview页面的message事件拿到下载提供的数据,进行下载操作

四、代码实现

1、“播放”按钮页面

  1. <template>
  2. <view>
  3. <view class="container">
  4. <button @tap="downloadVideo">下载、查看视频</button>
  5. </view>
  6. </view>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. // h5的地址
  13. url: 'http://127.0.0.1:5501/1.html'
  14. }
  15. },
  16. methods: {
  17. downloadVideo: function(e) {
  18. // 跳转到新webview页面,encodeURIComponent:url参数中出现空格等特殊字符时需要对参数进行编码
  19. uni.navigateTo({
  20. url: '/pages/webview/webview?url=' + encodeURIComponent(this.url)
  21. })
  22. }
  23. }
  24. }
  25. </script>
  26. <style>
  27. </style>

2、webview页面

  1. <template>
  2. <view>
  3. <web-view :src="url" @message="onMessage"></web-view>
  4. <button class="download-btn" @click="downloadVideo">下载视频</button>
  5. </view>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. downloadUrl: 'https://www.example.com/example.mp4',
  12. // url: 'https://www.example.com/index.html?videourl=xxx'
  13. // url: 'https://tieba.baidu.com/p/7722618570?red_tag=1419125733'
  14. url: ''
  15. }
  16. },
  17. methods: {
  18. onMessage(e) {
  19. // 接收H5页面发送的消息
  20. console.log('接收H5页面发送的消息', e)
  21. // if (e.detail.data && e.detail.data.type === 'getDownloadUrl')
  22. if (e.detail.data && e.detail.data[e.detail.data.length - 1].type == 'getDownloadUrl') {
  23. // 保存下载链接
  24. let downloadUrl = e.detail.data[e.detail.data.length - 1].url
  25. this.downloadUrl = downloadUrl
  26. // 去下载
  27. this.downloadVideo()
  28. }
  29. },
  30. downloadVideo() {
  31. // 使用 uni.downloadFile() 方法下载视频资源
  32. console.log('下载')
  33. // 打开loading等待
  34. uni.showLoading({
  35. mask: true,
  36. title: '加载中'
  37. })
  38. uni.downloadFile({
  39. url: this.downloadUrl,
  40. success: (res) => {
  41. console.log('success', res)
  42. if (res.statusCode === 200) {
  43. uni.hideLoading()
  44. // 使用 uni.saveVideoToPhotosAlbum() 方法保存到相册
  45. uni.saveVideoToPhotosAlbum({
  46. filePath: res.tempFilePath,
  47. success: () => {
  48. uni.showToast({
  49. title: '下载成功'
  50. })
  51. }
  52. })
  53. }
  54. },
  55. fail: (res) => {
  56. console.log('fail')
  57. }
  58. })
  59. }
  60. },
  61. onLoad(option) {
  62. console.log('option', option)
  63. let url = decodeURIComponent(option.url) // 解码
  64. this.url = url
  65. }
  66. }
  67. </script>
  68. <style>
  69. </style>

3、h5页面

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  6. <title>网络网页</title>
  7. <style type="text/css">
  8. .btn {
  9. display: block;
  10. margin: 20px auto;
  11. padding: 5px;
  12. background-color: #007aff;
  13. border: 0;
  14. color: #ffffff;
  15. height: 40px;
  16. width: 200px;
  17. }
  18. .btn-red {
  19. background-color: #dd524d;
  20. }
  21. .btn-yellow {
  22. background-color: #f0ad4e;
  23. }
  24. .desc {
  25. padding: 10px;
  26. color: #999999;
  27. }
  28. .post-message-section {
  29. visibility: hidden;
  30. }
  31. </style>
  32. <script src="https://uniapp.dcloud.io/api/router?id=navigate&name=app"></script>
  33. </head>
  34. <body>
  35. <div>
  36. <video width="100%" controls
  37. src="http://v6.huanqiucdn.cn/4394989evodtranscq1500012236/d9cc07e4243791581279828388/v.f100830.mp4"
  38. poster="https://v6.huanqiucdn.cn/4394989evodtranscq1500012236/d9cc07e4243791581279828388/sampleSnapshot/sampleSnapshot_10_0.jpg"
  39. ></video>
  40. </div>
  41. <p class="desc">web-view 组件加载网络 html 示例。点击下列按钮,跳转至其它页面。</p>
  42. <div class="btn-list">
  43. <button class="btn" type="button" data-action="navigateTo">navigateTo</button>
  44. <button class="btn" type="button" data-action="redirectTo">redirectTo</button>
  45. <button class="btn" type="button" data-action="navigateBack">navigateBack</button>
  46. <button class="btn" type="button" data-action="reLaunch">reLaunch</button>
  47. <button class="btn" type="button" data-action="switchTab">switchTab</button>
  48. </div>
  49. <div class="post-message-section">
  50. <p class="desc">网页向应用发送消息,注意:小程序端应用会在此页面后退时接收到消息。</p>
  51. <div class="btn-list">
  52. <button class="btn btn-red" type="button" id="postMessage">postMessage</button>
  53. </div>
  54. <div class="btn-list">
  55. <button class="btn btn-red" type="button" id="downLoad">下载</button>
  56. </div>
  57. </div>
  58. <script type="text/javascript">
  59. const videoUrl = 'http://v6.huanqiucdn.cn/4394989evodtranscq1500012236/d9cc07e4243791581279828388/v.f100830.mp4'
  60. var userAgent = navigator.userAgent;
  61. if (/miniProgram/i.test(userAgent) && /micromessenger/i.test(userAgent)) {
  62. // 微信小程序 JS-SDK 如果不需要兼容微信小程序,则无需引用此 JS 文件。
  63. document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');
  64. } else if (/quickapp/i.test(userAgent)) {
  65. // quickapp
  66. document.write('<script type="text/javascript" src="https://quickapp/jssdk.webview.min.js"><\/script>');
  67. }
  68. if (!/toutiaomicroapp/i.test(userAgent)) {
  69. document.querySelector('.post-message-section').style.visibility = 'visible';
  70. }
  71. </script>
  72. <!-- uni 的 SDK -->
  73. <!-- 需要把 uni.webview.1.5.4.js 下载到自己的服务器 -->
  74. <script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script>
  75. <script type="text/javascript">
  76. // 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
  77. document.addEventListener('UniAppJSBridgeReady', function () {
  78. uni.postMessage({
  79. data: {
  80. action: 'message'
  81. }
  82. });
  83. uni.getEnv(function (res) {
  84. console.log('当前环境:' + JSON.stringify(res));
  85. });
  86. document.querySelector('.btn-list').addEventListener('click', function (evt) {
  87. var target = evt.target;
  88. if (target.tagName === 'BUTTON') {
  89. var action = target.getAttribute('data-action');
  90. switch (action) {
  91. case 'switchTab':
  92. uni.switchTab({
  93. url: '/pages/tabBar/API/API'
  94. });
  95. break;
  96. case 'reLaunch':
  97. uni.reLaunch({
  98. url: '/pages/tabBar/component/component'
  99. });
  100. break;
  101. case 'navigateBack':
  102. uni.navigateBack({
  103. delta: 1
  104. });
  105. break;
  106. default:
  107. uni[action]({
  108. url: '/pages/component/button/button'
  109. });
  110. break;
  111. }
  112. }
  113. });
  114. document.getElementById('postMessage').addEventListener('click', function () {
  115. uni.postMessage({
  116. data: {
  117. action: 'message'
  118. }
  119. });
  120. });
  121. document.getElementById('downLoad').addEventListener('click', function () {
  122. console.log('uni```````````````````', uni)
  123. uni.postMessage({
  124. data: {
  125. type: 'getDownloadUrl',
  126. url: videoUrl
  127. }
  128. });
  129. uni.navigateBack({
  130. delta: 1
  131. });
  132. })
  133. });
  134. </script>
  135. </body>
  136. </html>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/636962
推荐阅读
相关标签
  

闽ICP备14008679号