微信小程序下载保存文件

前言
总是有需求想在微信小程序里面做下载文件并保存的功能,所以自己整理了一下小程序涉及到下载api,大致理了下在小程序里面下载的流程和解决方案。

一、涉及api
1.wx.saveFile()
​ 文档链接:https://developers.weixin.qq.com/miniprogram/dev/api/file/wx.saveFile.html

作用:保存文件到本地。

​注意:
1.该api调用的限制是下载文件最大为10m,且该接口已停止维护。
2.不支持保存后的文件转发,保存后的文件仅支持在小程序内使用。
3.保存的位置是在小程序缓存里面,开发者和用户不需要关心。

2.wx.downloadFile()
​ 文档链接:https://developers.weixin.qq.com/miniprogram/dev/api/network/download/wx.downloadFile.html

作用:下载文件资源到本地。客户端直接发起一个 HTTPS GET 请求,返回文件的本地临时路径 (本地路径)。
注意:
单次下载允许的最大文件为 200MB。

3.wx.getFileSystemManager().saveFile()
文档链接:https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.saveFile.html

作用:微信文件管理对象,保存临时文件到本地。
注意:
1.FileSystemManager是微信小程序文件管理器,通过 wx.getFileSystemManager 获取,saveFile()是它提供的一个方法

4.api总结
以上三个api都不能实现真正意义的下载保存,因为微信小程序提供的存储服务是以小程序和用户维度隔离的存储服务,所以下载下来之后用户并不能访问到自己下载的文件。做不到用户下载文件之后可以快捷的找到下载的文件。只是下载到微信app的缓存里面。且微信也不建议开发人员或用户去查询本地文件存储的路径。该结论官方文档也有具体说明:


文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/ability/file-system.html

二、解决方案
基于以上问题,有以下可实行的解决方案

1.方案一
使用wx.downloadFile() 下载对应文件后,使用fileSystemManager.saveFile API保存文件为图片格式;保存成功后,再使用wx.saveImageToPhotosAlbum保存到相册,然后这个时候我们给出弹窗提醒让用户跑到相册文件中找到对应的文件重命名改掉文件格式。

缺陷:这种方式对iOS某些机型系统不兼容。具体我也没去试,因为后续没有使用该方案。

代码:因为我是用uniapp写的案例,所以代码是这样的,且因为做个示例,代码格式写的层层嵌套,但是大概实现关键代码都在,望各位大佬包容。

            downloadFile(){
                let link = 'https://www.gjtool.cn/pdfh5/git.pdf'
                //下载文件
                wx.downloadFile({
                  url: link,
                  success (res) {
                    if (res.statusCode === 200) {
                      //重新改写文件后缀
                      wx.getFileSystemManager().saveFile({
                          tempFilePath:res.tempFilePath,
                          //wx.env.USER_DATA_PATH 是微信提供了一个用户文件目录给开发者,开发者对这个目录有完全自由的读写权限
                          filePath:`${wx.env.USER_DATA_PATH}/hello.png`,
                            success(res) {
                              console.log(res.savedFilePath) // res.savedFilePath 为一个本地缓存文件路径
                              //保存图片
                              wx.saveImageToPhotosAlbum({
                                  filePath:res.savedFilePath,
                                  success(res) {
                                      console.log(res)
                                      console.log('保存图片成功')
                                      //这里可以出个弹窗,给用户提醒,让他去文件管理器里面找到后重命名
                                  }
                              })
                            }
                      })
                    }
                  }
                })
            },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
该代码片段在自己的安卓机上测过了,可以实现。

2.方案二
​ 先使用下载文件api把文件下载下来,再使用wx.openDocument() 打开文件里面加上showMenu字段,然后就可以看到在打开的文件右上角出现了···,

​ ios表现:ios点击之后会有发送给朋友的选项,选择分享给朋友之后就可以把文件直接发送给对方了,然后你就可以在聊天记录里面拿到这个文件;

​ 安卓表现:安卓手机里面有保存文件的选项;

缺陷:不能 “下载”后直接选择某个文件发给其他人,这个方案每次想发送必须先上小程序找到该文件,下载打开文件再去转发(而且必须是微信好友);或者在之前转发的聊天记录里面找到该文件。

代码:

            downloadFileOpen(){
                let link = 'https://www.gjtool.cn/pdfh5/git.pdf'
                //下载文件
                wx.downloadFile({
                  url: link,
                  success (res) {
                    if (res.statusCode === 200) {
                        const filePath = res.tempFilePath
                        wx.openDocument({
                          filePath: filePath,
                          showMenu:true, //关键点
                          success: function (res) {
                            console.log('打开文档成功')
                          }
                        })
                    }
                  }
                })
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
安卓具体表现:

ios具体表现:


总结
其实没啥好说的,仔细看官方文档还是能看到这个“文件下载保存功能”不是我们正常想的下载文件到手机里面,随便可以分享的。后续我们在项目中也是使用的方案二,方案一用户体验不好所以没有考虑了。

注意:因为微信小程序的能力也在不断增加,所以该文章适用于我文章发布时间。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微信小程序的webview中,要实现文件下载功能,可以通过以下步骤进行操作: 1. 在小程序webview中,可以使用标准的HTML元素`<a>`来触发文件下载。首先,在小程序的webview页面中,添加一个下载按钮或者链接,例如: ```html <a href="https://example.com/path/to/file.pdf" download>点击下载文件</a> ``` 其中`https://example.com/path/to/file.pdf`是要下载文件的URL,`download`属性表示要下载文件而不是在浏览器中打开。 2. 在小程序的webview页面的JS代码中,可以监听这个下载链接的点击事件,并在点击时触发文件下载。例如: ```javascript document.querySelector('a').addEventListener('click', function(e) { e.preventDefault(); // 阻止默认的链接跳转行为 var url = this.getAttribute('href'); wx.downloadFile({ url: url, success: function(res) { var filePath = res.tempFilePath; // 下载后的临时文件路径 wx.saveFile({ tempFilePath: filePath, success: function(res) { var savedFilePath = res.savedFilePath; // 保存后的文件路径 // 文件保存成功后的操作 }, fail: function(res) { // 文件保存失败后的操作 } }); }, fail: function(res) { // 文件下载失败后的操作 } }); }); ``` 以上代码中,`document.querySelector('a')`用于获取第一个`<a>`元素,根据实际情况可能需要修改选择器;`wx.downloadFile`用于下载文件,`wx.saveFile`用于保存文件到本地。 需要注意的是,下载文件需要在小程序的`app.json`配置文件中添加相应的权限设置,例如: ```json { "mp-weixin": { "permission": { "scope.userLocation": { "desc": "获取您的地理位置信息将用于小程序定位" }, "scope.writePhotosAlbum": { "desc": "保存图片到相册" }, "scope.camera": { "desc": "拍摄照片或者录像" }, "scope.record": { "desc": "录制音频" }, "scope.userInfo": { "desc": "获取您的基本信息将用于小程序登录" }, "scope.userLocationBackground": { "desc": "获取您的地理位置信息将用于小程序定位" }, "scope.invoiceTitle": { "desc": "获取你发票抬头" }, "scope.invoice": { "desc": "获取你发票" }, "scope.werun": { "desc": "微信运动步数" }, "scope.writeVideosAlbum": { "desc": "保存视频到相册" } } } } ``` 以上是在微信小程序webview中实现文件下载的一种方式,你可以根据具体需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值