前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uniapp微信小程序完美实现下载视频功能

uniapp微信小程序完美实现下载视频功能

原创
作者头像
iwhao
修改2024-06-20 10:05:17
1590
修改2024-06-20 10:05:17

简单介绍

基于 uni-app 开发的微信小程序下载视频功能

下载视频 简单写法

代码语言:js
复制
uni.downloadFile({

    url: 'http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400',

    success: (res) => {

      uni.saveVideoToPhotosAlbum({

        filePath: res.tempFilePath,

        success:(res) => {

          this.createDownRecord(item.url, 2)

           uni.showToast({

            title: '下载成功',

            icon: 'success',

          })

        }

      })

    }

})

这种写法有点问题,

第一 如果视频文件过大,或者网络状态不佳, 没有提示,不知道当前下载进度,不友好

第二 当响应头中 content-type 为以下 值时

Content-Type: application/octet-stream

ios 端下载视频会有问题(自测小程序模拟器和安卓手机下载没问题)

会提示错误 saveVideoToPhotosAlbum:fail invalid file type

原因,苹果手机端小程序 不支持临时文件路径 缓存,所以需要在 uni.downloadFile中需要配置filePath(指定文件下载下来保存的本地址)

先解决第一个问题 优化提示信息

优化提示信息 提示下载进度百分比

用到了 小程序的 Api DownloadTask.onProgressUpdate

uni-app 也延用了 这个api

代码语言:js
复制
const task = uni.downloadFile({

    url: videoUrl,

    success: (res) => {

      uni.saveVideoToPhotosAlbum({

        filePath: res.tempFilePath,

        success:(res) => {

          this.createDownRecord(item.url, 2)

           uni.showToast({

            title: '下载成功',

            icon: 'success',

          })

        }

      })

    }

})

task.onProgressUpdate(this.onProgress)
代码语言:js
复制
// 提示下载进度

onProgress(res){

  uni.showToast({

    icon:'loading',

    mask:true,

    title: res.progress + "%"

  })

}

第二个问题 兼容 苹果端小程序视频下载

方案一

简单点话就是 前端不用改,后端配置 响应头 为以下值 就完美解决了

代码语言:http
复制
    Content-Type: video/mp4

方案二

还有一种是 前端是来处理

解决思路

既然 不支持 临时缓存文件 地址,那就直接保存到用户目录路径 (本地路径),待保存完毕后,再删除掉这个文件,这样相当于手动实现了 临时缓存文件

1.需要自定义文件名称

代码语言:js
复制
let fileName = new Date().valueOf();

2.需要访问 文件系统中的用户目录路径 (本地路径)

USER_DATA_PATH(来自wx.env)

3.需要用到小程序的 获取全局唯一的文件管理器的api

getFileSystemManager

4.还有删除文件的api

FileSystemManager.unlink

具体实现

代码语言:js
复制
// 下载视频

downloadVideo(url){

  // 自定义 文件名称

  let fileName = new Date().valueOf();

  const task = uni.downloadFile({

    url: url,

    filePath: wx.env.USER_DATA_PATH + '/' + fileName + '.mp4',

    //  拼接本地文件路径

    success: (res) => {

      let filePath = res.filePath

      uni.saveVideoToPhotosAlbum({

        filePath,

        success:(res) => {

          uni.showToast({

            title: '下载成功',

            icon: 'success',

          })

          let fileMgr = wx.getFileSystemManager();

          // 删除本地文件

          fileMgr.unlink({

            filePath: wx.env.USER_DATA_PATH + '/' + fileName + '.mp4',

            success: function(r) {

              console.log('unlink-getFileSystemManager')

              console.log(r)

            },

          })

        },

        complete(res) {

          console.log('saveVideoToPhotosAlbum-complete')

          console.log(res)

        }

      })

    },

    complete(res) {

      console.log('downloadFiledownloadFiledownloadFiledownloadFiledownloadFile')

      console.log(res)

      uni.hideLoading()

    }

  })

  task.onProgressUpdate(this.onProgress)

},

完整代码

代码语言:js
复制
<template>

    <view>

        <video class="videos" :src="url" @error="ErrorCallback" controls> </video>

        </view>

        <view class="btn" @click="downloadVideo(url)">下载视频</view>

    </view>

<template>

export default {

  name:'greetingStore',

  components:{

    action,

    firstPciture,

    poster,

    videos,

    greetMsg

  },

  data(){

    return {

      url:  'http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400'

    }

  },

  methods:{

    // 下载视频

    downloadVideo(url){

      // 自定义 文件名称

      let fileName = new Date().valueOf();

      const task = uni.downloadFile({

        url: url,

        filePath: wx.env.USER\_DATA\_PATH + '/' + fileName + '.mp4', //  拼接本地文件路径

        success: (res) => {

          let filePath = res.filePath

          uni.saveVideoToPhotosAlbum({

            filePath,

            success:(res) => {

              uni.showToast({

                title: '下载成功',

                icon: 'success',

              })

              let fileMgr = wx.getFileSystemManager();

              // 删除本地文件

              fileMgr.unlink({

                filePath: wx.env.USER\_DATA\_PATH + '/' + fileName + '.mp4',

                success: function(r) {

                  console.log('unlink-getFileSystemManager')

                  console.log(r)

                },

              })

            },

            complete(res) {

              console.log('saveVideoToPhotosAlbum-complete')

              console.log(res)

            }

          })

        },

        complete(res) {

          console.log('downloadFiledownloadFiledownloadFiledownloadFiledownloadFile')

          console.log(res)

          uni.hideLoading()

        }

      })

      task.onProgressUpdate(this.onProgress)

    },

    // 提示下载进度

    onProgress(res){

      uni.showToast({

        icon:'loading',

        mask:true,

        title: res.progress + "%"

      })

    },

  }

}

待优化

  1. 可在封装成一个公共方法,支持回调事件,也简单 用 Promise 实现就可以了
  2. 完善提示下载进度,可以优化下 样式,考虑用 u-viwe框架中的 进度条组件

以上就是本篇的全部内容了,非常感谢帅哥美女们能看到这里,如果这个文章写得还不错或者对你有一点点帮助,求点赞,求关注,求分享,当然有任何问题可以在评论讨论,我都会积极回答的,再次感谢😁

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单介绍
    • 下载视频 简单写法
    • 优化提示信息 提示下载进度百分比
    • 第二个问题 兼容 苹果端小程序视频下载
      • 方案一
        • 方案二
          • 具体实现
            • 完整代码
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档