查了很多资料,小程wx.downloadFile(Object object)下载的pdf文件只能保存在小程序的文件目录内(藏得很深用户一般找不到),跟随小程序的删除而被清理。
图片和视频倒是可以通过api保存到系统相册中。
pdf这类的文件只能通过wx.openDocument预览的时候开启右上角转发或者引导用户复制下载链接用浏览器打开来下载。
按官方的说法下载的本地文件分三类链接地址
这里选择的是pdf下载下来让用户预览的时候自己选择是否转发保存出来。
一开始我参考了百度的方法通过 wx.downloadFile 下载临时文件wx.saveFile(Object object)保存成本地缓存文件最后wx.openDocument打开预览。但是这里我注意到一个坑官方的文档说明wx.saveFile(Object object)只能存10M
而且wx.openDocument转发的pdf文件会丢失pdf后缀直接打不开
排查了半天好像是wx.downloadFile临时文件的原因。咨询社区的方案wx.downloadFile使用fath参数将文件输出改成自定义的文件名加后缀。
//查看并下载
See_download() {
wx.downloadFile({//下载
url: url,//服务器上的pdf地址
filePath: wx.env.USER_DATA_PATH + '/test.pdf',//自定义文件地址
success: function (res) {
var filePath = res.filePath
wx.openDocument({//打开
filePath: filePath,
success: function (res) {}
})
}
})
}
成功是成功了,但是wx.saveFile保存的时候报错而用wx.getSavedFileList找不到文件在哪?后续多了内存溢出怎么办?
经过一番我注意到
原来这路径实际已经保存到本地用户文件里了。直接省去wx.saveFile这一步。只要通过.readdir删除就可以了
// 删除本地文件
deletContract() {
try {
let file = wx.getFileSystemManager();
file.readdir({
dirPath: `${wx.env.USER_DATA_PATH}`,
success: res => {
console.log(res);
if (res.files.length > 2) {
file.unlink({
filePath: `${wx.env.USER_DATA_PATH}/${res.files[0]}`,
complete: res => {
}
})
}
}
})
} catch (error) {
}
},
最后代码
let that = this;
const fileExtName = ".pdf";
const randfile = new Date().getTime() + fileExtName;
const newPath = `${wx.env.USER_DATA_PATH}/${randfile}`;
that.deletContract();
wx.downloadFile({
url: 下载pdf的链接url,
filePath: newPath,
success: function (res) {
const filePath = res.tempFilePath;
wx.openDocument({
filePath: newPath,
showMenu: true,
fileType: 'pdf',
success: function (res) {}
})
},
fail: function (res) {
wx.hideLoading();
}
})