文件预览和下载

在下载之前,我们得先调用接口获取文件下载的url

然后通过wx.downloadFile将下载文件资源到本地

wx.downloadFile({
url: res.data.url,
success: function (res) {
console.log('数据',res);
}
})

tempFilePath就是临时临时文件路径。

通过wx.openDocument打开文件。

showMenu表示预览文件右上方的菜单,你可以在该菜单中选择保存文件,将文件显示的保存到本地。

// 预览和下载
wx.downloadFile({
url: res.data.url,
success: function (res) {
const filePath = res.tempFilePath // 临时文件路径
wx.openDocument({
filePath: filePath,
showMenu: true // 预览文件右上方的...
})
}
})

到这里文件的预览和存储就完成了,你可以显示的看到文件的存储位置。

这是文件操作的其中一种方式,如果你要具体的操作文件,请继续向下看。


文件系统

文件系统是这篇着重要讲的,其实在上文中提到的wx.downloadFile这一步就是文件下载的关键,文件下载成功(临时)会触发success回调,你可以通过DownloadTask监听文件下载的进度,当downloadTask进度为100时,downloadFilesuccess下载成功就会被触发。

      const downloadTask = wx.downloadFile({
url: res.data.url,
success: function (res) {
// progress进度100时触发success
}
})
downloadTask.onProgressUpdate((res) => {
console.log('下载进度', res.progress)
console.log('已经下载的数据长度', res.totalBytesWritten)
console.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite)
})

wx.downloadFiletempFilePath对应的就是临时文件的存储位置,这个文件是会被删除的。因此如果你需要持久化文件,则需要调用saveFile来保存文件。同时tempFilePath也可以作为一个中转,为后续使用资源提供支持,所以我们在后续调用wx.openDocument时,tempFilePath其实是做了文件中转,在openDocument对文件做了后续的保存或预览操作。

微信小程序本身自带一个文件系统,官网介绍:文件系统

在文件系统中有关于本地临时文件的介绍:

本地临时文件只能通过调用特定接口产生,不能直接写入内容。本地临时文件产生后,仅在当前生命周期内保证有效,重启之后不一定可用。如果需要保证在下次启动时无需下载,可通过 FileSystemManager.saveFile()FileSystemManager.copyFile() 接口把本地临时文件转换成本地缓存文件或本地用户文件。

在上文中我们将wx.downloadFile返回的临时路径当作中转,调用wx.openDocument来保存文件,这是一种方法,还有一种就是操作文件系统API,对临时文件进行移动、保存、复制等操作。

下面我们通过文件系统来实现文件的保存:

API文档:wx.getFileSystemManager()

流程如下:

1、获取文件下载url

2、wx.downloadFile下载文件

3、判断文件夹是否存在:

  • 存在:通过saveFile直接下载
  • 不存在:通过mkdir创建文件夹,创建完成后,通过saveFile直接下载
  async downloadPdf(id) {
let that = this;
let res = await getPdfAPI(id);
// 下载文件
wx.downloadFile({
url: res.data.url,
success: async (res) => {
// 设置存储路径
let myPath = wx.env.USER_DATA_PATH + '/MyFile'
try {
// 判断文件夹是否存在
await that.fileExist(myPath)
// 存在: 保存文件到本地
await that.fileSave(res.tempFilePath, myPath).catch(err => console.log(err));
wx.showToast({
title: '保存成功',
icon: 'none'
})
} catch (e) {
// 不存在: 创建文件夹
await that.fileMkdir(myPath).catch(err => console.log(err));
// 保存文件到本地
await that.fileSave(res.tempFilePath, myPath).catch(err => console.log(err));
wx.showToast({
title: '保存成功',
icon: 'none'
})
}
}
})
}, // 保存文件
fileSave(tempFilePath, myPath) {
return new Promise(function (resolve, reject) {
const fileManager = wx.getFileSystemManager(); // 文件系统
fileManager.saveFile({
tempFilePath: tempFilePath, // 临时文件路径
filePath: myPath + '/myFileName.pdf', // 文件夹路径 + 文件名
success: function (res) {
resolve(res)
},
fail: function (err) {
reject(err)
}
})
})
}, // 创建文件夹
fileMkdir(myPath) {
return new Promise(function (resolve, reject) {
const fileManager = wx.getFileSystemManager(); // 文件系统
fileManager.mkdir({
dirPath: myPath, // 文件夹路径
success: function (mkdir) {
resolve(mkdir)
},
fail: function (mkdirerr) {
reject(mkdirerr)
}
})
})
}, // 判断文件夹是否存在
fileExist(myPath) {
return new Promise(function (resolve, reject) {
const fileManager = wx.getFileSystemManager(); // 文件系统
fileManager.access({
path: myPath, // 文件夹路径
success: function (exist) {
resolve(exist)
},
fail: function (err) {
reject(err)
}
})
})
},

注意点:

1、saveFile自定义保存路径filePath文件夹路径+文件名的拼接

2、saveFile接收的文件路径为wx.downloadFile获取的临时路径tempFilePath

3、wx.env.USER_DATA_PATH是一个字符串,表示文件系统中的用户目录路径 (本地路径)

关于存储位置:

PC端中:

wx.env.USER_DATA_PATH默认指向usr文件夹,微信开发者工具中可以看到保存路径:

真机中:

真机的默认存储位置为:内部存储/Android/data/com.tencent.mm/MicroMsg/wxanewfiles/

也就是wxanewfiles文件夹下的子文件夹,该文件夹不固定


参考文档:

wx.downloadFile

wx.openDocument

DownloadTask

wx.env

文件系统

wx.getFileSystemManager()

FileSystemManager.mkdir(Object object)

FileSystemManager.saveFile(Object object)

FileSystemManager.access(Object object)


如果你觉得本文章不错,欢迎点赞、收藏、转发哦~

阅读其它:

微信小程序记住密码,让登录解放双手 (点击直达)

微信小程序动态生成表单来啦!你再也不需要手写表单了! (点击直达)

根据URL批量下载文件并压缩成zip文件 (点击直达)

文档、视频、图片上传(点击、拖拽、批量导入)要‍‍‍‍怎么实现?! (点击直达)

一文搞懂原型和原型链 (点击直达)

微信小程序文件预览和下载-文件系统的更多相关文章

  1. 微信小程序手机预览请求不到数据(最后一条不明所以)

    本地开发调试小程序时,用手机预览需要有如下设置:1.微信开发者工具中设置:不校验安全域名.web-view 域名.TLS 版本以及 HTTPS 证书.这样在有网络请求的时候,就可以访问本地的服务器了, ...

  2. 微信小程序H5预览页面框架(二维码不隐藏)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. 微信小程序H5预览页面框架

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. 微信小程序-图片预览

    仅供参考: 1,wxml: <view class="foot" bindtap="previewImage">我的小程序码</view> ...

  5. 微信小程序 图片预览 wx.previewImage

    官网地址: go官网 效果展示: list: [ 'http://img5.imgtn.bdimg.com/it/u=3300305952,1328708913&fm=26&gp=0. ...

  6. 微信小程序,预览在开发工具上显示正常,手机预览二维码报request->fail错误,打开手机的调试功能又正常。

    这里错误很明显是属于网址错误,开发工具和手机调试都能走request->success: 唯独常规模式下无法显示. 最开始调试过很多方法,没找出原因.最后到小程序开发设置才发现,自己未配置服务器 ...

  7. 微信小程序开发 -- 通过云函数下载任意文件

    微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 ​ 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...

  8. TODO:小程序手机预览调试

    TODO:小程序手机预览调试 1. 小程序注册,目前还未开通个人注册,主体类型为企业.政府.媒体.其他组织 2. 登录小程序,绑定开发者,获取AppID 3. 下载微信小程序示例-新片预告 https ...

  9. 微信小程序实例源码大全下载

     小程序QQ交流群:131894955  小程序开发直播腾讯课堂:  https://edu.csdn.net/course/detail/6743 微信小程序实例源码大全下载 微信小应用示例代码(p ...

  10. 120多套各种类别微信小程序模板源码打包下载

    120多套各种类别微信小程序模板源码打包下载,以下是部分截图欢迎下载!120多套各种类别微信小程序模板源码打包下载 下载地址:https://pan.baidu.com/s/1Cfqyc9p2ZDOc ...

随机推荐

  1. python教程 入门学习笔记 第2天 第一个python程序 代码规范 用默认的IDLE (Python GUI)编辑器编写

    四.第一个python程序 1.用默认的IDLE (Python GUI)编辑器编写 2.在新建文件中写代码,在初始窗口中编译运行 3.写完后保存为以.py扩展名的文件 4.按F5键执行,在初始窗口观 ...

  2. NOIP2022 题解

    终于有机会补NOIP的题了 T1 考虑枚举 C 与 F 的纵列 考虑预处理出每个点最左边和最下边可以延伸到哪 之后枚举列,然后对行做类似于扫描线的操作,统计有多少可行的 "第一横行" ...

  3. xshell批量新建会话

    1,xshell的会话形式就是文件夹和文件,我们只需要修改文件名称即可,但是一个个弄很麻烦,可以利用这个程序来批量新建(程序很烂,但能用) 基于python编写,文件处理 --> 文件下载 提取 ...

  4. C#利用Refit实现JWT自动续期

    前言 笔者之前开发过一套C/S架构的桌面应用,采用了JWT作为用户的登录认证和授权.遇到的唯一问题就是JWT过期了该怎么办?设想当一个用户正在进行业务操作,突然因为Token过期失效,莫名其妙地跳转到 ...

  5. Dynamics 365 自定义渠道的步骤

    1.创建2个实体:渠道[new_flashinfosmschannel].消息模板(配置窗体)注意:如果想用标准消息模板,可以不用创建消息模板 标准消息模板效果: 2.导出解决方案,往XML增加一个关 ...

  6. 分库表数据倾斜的处理让我联想到了AKF模型

    1 背景 最近在做需求的时候需要在一张表中增加一个字段. 这张表情况如下: 1.拆分了多个库多张表 2.库表拆分按表中商户编码字段hash之后取模进行拆分 由于库表拆分按照商户编码,有些大商家的单子数 ...

  7. PostgreSQL-分区表介绍

    一.分区简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议当单表大小超过内存就可以考虑表分区了. 表的分区就是将一个逻辑上的大表(主 ...

  8. Solution Set -「ARC 109」

    「ARC 109A」Hands Link. 讨论即可,除了煞笔出题人写了个死马的题面. #include<cstdio> #include<algorithm> using n ...

  9. 中国这么多 Java 开发者,应该诞生出生态级应用开发框架

    1.必须要有,不然就永远不会有 应用开发框架,虽然没有芯片.操作系统.数据库.编程语言这些重要.但是最终呈现在用户面前的,总是有软件部分.而软件系统开发,一般都需要应用开发框架,它是软件系统的基础性部 ...

  10. 噢耶!字节后端Offer,拿到了

    很多同学反馈多搞点面经,说来就来! 今天分享一位拿到字节跳动实习Offer的面经,没错,Java转Go. 别问我选Java还是选Go,成年人不做选择题.先搞定一个语言,再学第二语言从来不是难事. 无论 ...