uni.downloadFile 指定 filePath 参数将下载的文件保存到本地路径,实现该路径下文件删除功能
项目需求:小程序下载报错saveFile:failexceeded themaximum sizeof thefile storage
理论:小程序的存储空间是有限制的(通常为10MB),但这个限制是针对整个小程序的持久化存储空间(即通过wx.saveFile保存的文件)而言的。
关键点:1.wx.downloadFile的filePath参数允许我们将下载的文件直接保存到指定的路径,这个路径可以是小程序用户文件目录(wx.env.USER_DATA_PATH)下的某个路径。2.当我们指定filePath时,下载的文件会直接保存到该路径,而不再返回临时文件路径(tempFilePath),而是返回filePath。3.这个保存操作是否会受到小程序存储空间的限制?根据微信官方文档和实际开发经验:
-小程序的文件系统分为临时文件和本地用户文件。
临时文件(如通过wx.downloadFile不指定filePath时得到的临时文件)不会计入存储空间,但可能在后续被系统清理。
本地用户文件是持久化的,保存在wx.env.USER_DATA_PATH目录下,这些文件会被计入小程序的存储空间(10MB限制)。因此,当我们使用filePath参数将文件直接下载到用户文件目录时,这个文件就会占用小程序的存储空间。如果此时小程序已经使用的存储空间加上当前下载文件的大小超过了10MB,那么就会触发downloadFile:fail themaximum sizeof thefile storage错误。
如何避免?直接清理(删除)该路径下的文件,可以通过以下方式实现:
1. 使用fs.readdirSync 读取用户数据存储路径(wx.env.USER_DATA_PATH)下所有文件夹以及文件,循环进行删除
示例代码如下:
downloadFile(){
// 下载文件
uni.downloadFile({
url: ' https://example.com/file.pdf ', // 文件下载地址
filePath:`${wx.env.USER_DATA_PATH}/${self.vdata.title}.${self.vdata.ext_code}`, // 指定保存路径
success: (res) => {
if (res.statusCode === 200) {
console.log('文件下载成功,路径:', res.filePath);
// 下载完成后删除文件(示例:延迟1秒后删除)
setTimeout(() => {
this.clearUserDataPath() // 如果影响其他业务问题可以在下次进入页面created()时调用
}, 1000);
}
},
fail: (err) => {
console.error('下载失败:', err);
}
});
},
clearUserDataPath() {
const userDatapath = wx.env.USER_DATA_PATH; // 用户数据存储路径
const fs = wx.getFileSystemManager(); // 获取文件管理器
// 同步读取目录内容,包括文件夹以及文件
const items = fs.readdirSync(userDatapath);
console.log('USER_DATA_PATH 下的文件列表:', items);
items.forEach(item => {
const fullPath = `${userDatapath}/${item}`;
if (fullPath.includes('miniprogramLog')) { // 跳过 miniprogramLog 文件
console.warn(`Skipping deletion of protected file: ${fullPath}`);
return;
}
deleteAllFilesAndDirs(fullPath)//循环删除该路径下所以文件夹以及文件
})
console.log('USER_DATA_PATH 下的所有文件已被清空');
},
deleteAllFilesAndDirs(fullPath){
const fs = wx.getFileSystemManager();
let res;
try{
res = fs.statSync(fullPath); // 同步获取资源的状态信息
}catch(e){
console.warn(`Path does not exist or inaccessible: ${fullPath}`, e);
return false;
}
if(res && res.isDirectory()){
//删除文件夹
const fileList = fs.readdirSync(fullPath).map(files => `${fullPath}/${files}`);//获取文件夹下的文件
console.log(fileList)
fileList.forEach(filePath=>{
deleteAllFilesAndDirs(filePath); // 如果当前项是一个目录,则再次调用自身进行深层清理
});
try{
fs.rmdirSync(fullPath); // 当内部已无残留内容时尝试移除空壳容器本身
console.info(`Successfully removed directory at "${fullPath}"`);
}catch(err){
console.error(`Failed to remove directory after cleaning up its content: ${err.message}`);
}
}else if(res && res.isFile()){
try {
// 尝试删除单个普通文件
fs.unlinkSync(fullPath);
console.log(`已成功删除 ${fullPath}`);
} catch (error) {
console.error(`Error while trying to unlink file: ${error.message}`);
}
}
}
2. 注意事项
日志文件miniprogramLog删除不掉:
删除时要指定删除不掉的文件进行跳过,否则会删除中断。
平台兼容性:
uni.getFileSystemManager() 在小程序和App端支持,但H5端无法直接操作本地文件系统。如果需要在H5端清理文件,需通过其他方式(如服务端清理或前端缓存管理)。
3. 替代方案:不指定 filePath
如果不指定 filePath,uni.downloadFile 会默认将文件保存到临时目录(临时路径),系统可能会在适当时机自动清理。但临时文件的生命周期由平台决定,不可控,因此建议显式管理文件。
总结
推荐方法:通过 uni.getFileSystemManager().unlinkSync主动删除文件。
关键点:确保路径正确,并处理可能的失败情况(如文件不存在或权限不足)。
如果有其他平台或场景的特殊需求,可以进一步补充说明!
更多推荐



所有评论(0)