ionic应用程序文件保存和清除缓存

一.简介

在开发ionic应用程序中,我们难免会涉及到文件的下载,并且将下载的文件(可以是png,pdf,zip等文件)保存到本地,时间一久,文件堆积过多,就需要对缓存进行清理以减少占用手机空间。我们先讲一下文件的保存,然后再讲清除缓存。

二.文件的保存

顺便提一下,关于文件的下载,有2篇文件讲得不错大家可以借鉴一下,前者是讲通过fileTransfer插件来进行文件的下载,后者通过XMLHttpRequest来进行文件的下载(因为fileTransfer已经过期,github上说可以使用XMLHttpRequest),我这边也是使用后一篇文章介绍的方法来处理文件下载。

我们讲讲文件的保存,需要用到的插件:

cordova-plugin-file

如果需要打开下载之后的文件,可以使用:

cordova-plugin-file-opener2

上面两个插件file和file-opener2的安装方法参照ionic官网的文档即可。 这里需要注意一下,由于我使用的是ionic3进行开发,如今ionic4已经出来一段时间了。

安装完opener2后,进行build android就遇到了比较多的问题,我不太确定是不是这个插件的影响,但是在安装这个插件之前build android是没有报错的:

1.安装opener2之后,进行ionic cordova build android,如果报错unable to merge dex,可以使用cordova clean android,再使用ionic cordova build android(我是直接cordova platform rm android,然后cordova platform add android,最后再ionic cordova build android来解决问题的,如果上面不能解决的话,就试试我这种rm平台的方法)。
2.安装opener2之后,如果build android报错‘Attribute meta-data#android.support.VERSION’的话,需要去到项目的platform-android-build.gradle路径,在build.gradle文件中加入以下代码,其中的‘25.3.1’就是你报错中要支持的版本:
android.support.version.png
configurations.all {resolutionStrategy.eachDependency { DependencyResolveDetails details ->def requested = details.requestedif (requested.group == 'com.android.support') {if (!requested.name.startsWith("multidex")) {details.useVersion '25.3.1'}}}
}

保存文件前,先创建一个文件夹用来存放下载的文件,起名为myFile:

checkDir(){if(this.device.platform == null) {return;}let that = this;//获取路径let path;if(that.platform.is('ios')){//iospath = that.file.cacheDirectory;}else {path = that.file.externalCacheDirectory;}that.file.checkDir(path,"myFile").then(isExist=>{if(isExist){console.log("---checkDir 文件夹已经存在----");}else {console.log("---文件夹不存在----");//创建文件夹that.file.createDir(path,"myFile",true).then(()=>{console.log("---创建文件夹成功----");}).catch(() => {console.log("---创建文件夹失败----");});}}).catch(() => {console.log("---checkDir 失败----");//创建文件夹that.file.createDir(path,"myFile",true).then(()=>{console.log("---创建文件夹成功----");}).catch(() => {console.log("---创建文件夹失败----");});});
}

先检查有没有这个文件夹,没有才创建;存放文件夹的位置放在了cache里面。

保存并打开文件:

writeAndOpenFiles(url){console.log("--writeAndopenFiles--");let that = this;//获取fileNamelet fileName;fileName = url.substring(url.lastIndexOf('/') + 1,url.length);//获取路径let path;if(that.platform.is('ios')){//iospath = that.file.cacheDirectory;}else {path = that.file.externalCacheDirectory;}path = path + "myFile/";//第一次下载之后,需要先保存才能打开that.file.writeFile(path, fileName,blob, {replace: true}).then(()=>{console.log("--writeFile success--");//openlet mimeType = that.getFileMimeType(fileName);that.fileOpener.open(path + fileName, mimeType).then(() => {console.log('打开成功');}).catch(() => {console.log('打开失败');});}).catch((err=>{console.log("--writeFile fail--");}));
}getFileMimeType(fileName: string): string {let mimeType: string = '';//获取文件的类型let fileType = fileName.substring(fileName.lastIndexOf('.') + 1, fileName.length).toLowerCase();switch (fileType) {case 'txt':mimeType = 'text/plain';break;case 'docx':mimeType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';break;case 'doc':mimeType = 'application/msword';break;case 'pptx':mimeType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';break;case 'ppt':mimeType = 'application/vnd.ms-powerpoint';break;case 'xlsx':mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';break;case 'xls':mimeType = 'application/vnd.ms-excel';break;case 'zip':mimeType = 'application/x-zip-compressed';break;case 'rar':mimeType = 'application/octet-stream';break;case 'pdf':mimeType = 'application/pdf';break;case 'jpg':mimeType = 'image/jpeg';break;case 'png':mimeType = 'image/png';break;default:mimeType = 'application/' + fileType;break;}return mimeType;}

其中的url是下载的文件地址,blob是下载成功之后得到的文件数据,'myFile/'是存放下载文件的位置。注意一点,file.writeFile成功的话,success和fail的回调都会相应,不知道算不算file插件的bug。

三.清除缓存

清除缓存实际上就是清除下载的文件,对于我而言仅需清除cache里面的文件即可。 清除之前,可以计算一下所占的缓存容量并且显示在app上:

caculateCacheSize(){let that = this;//获取路径let path;if(that.platform.is('ios')){//iospath = that.file.cacheDirectory;}else {path = that.file.externalCacheDirectory;}that.file.listDir(path,"myFile").then(entry=>{console.log('---listDir成功---' + entry.length);let totalSize = 0;for(let i = 0;i < entry.length;i++){entry[i].getMetadata((metadata)=>{console.log("--metadata.size--" + metadata.size);totalSize = totalSize + metadata.size;if(i == entry.length - 1){that.formatSize(totalSize);}},()=>{})}}).catch(err => {console.log('---listDir失败---' + err);});
}formatSize(size){let tempSize = (parseFloat(size))/(1024*1024);console.log("---tempSize---" + tempSize);if(tempSize >= 0 && tempSize < 1024){//MBtempSize = Math.floor(tempSize * 100)/100;this.sizeStr = tempSize + "MB";}else {//GBtempSize = Math.floor(tempSize * 100)/100;this.sizeStr = tempSize/1024 + "GB";}console.log("---sizeStr---" + this.sizeStr);
}

其中的this.sizeStr就是占用的内存,这里只算了MB和GB,大家可以根据自身需求修改KB等。

清除缓存:

clearCache(){if(this.device.platform == null) {this.methodsProvider.showToast("请在真实的手机设备上清除缓存");return;}let that = this;//获取路径let path;if(that.platform.is('ios')){//iospath = that.file.cacheDirectory;}else {path = that.file.externalCacheDirectory;}that.file.checkDir(path,"myFile").then(isExist=>{if(isExist){console.log("---checkDir 文件夹已经存在----");//移除文件夹及其里面的文件that.file.removeRecursively(path,"myFile").then(removeResult=>{that.methodsProvider.showToast("清除缓存成功");}).catch(err => {that.methodsProvider.showToast("清除缓存失败");});}else {that.methodsProvider.showToast("清除缓存成功");}}).catch(() => {console.log("---checkDir 失败----");that.methodsProvider.showToast("清除缓存成功");});
}

注意这里使用file.removeRecursively 是清除文件夹和文件夹里面的文件,文件夹里面有文件的话,就不要使用file.removeDir,这个仅仅是删除文件夹,否者会报错。

四.总结 对于ionic应用程序的清除缓存,想到的就是清除你已经下载到本地的文件,当然还有localStorage的数据清除,如果还有其他的清除,请各位给我留言,大家共同进步。

转载自:https://www.jianshu.com/p/db1f687d274d

ionic应用程序文件保存和清除缓存相关推荐

  1. Android 程序常用功能《清除缓存》

    用户在使用我们所研发的App的时候,通常都会遇到如下的问题: 使用过程中可能会遇到应用程序或软件更新失败,因为用户的智能手机存储空间不足. 由于应用程序崩溃和其他问题,用户的数字设备运行速度比以前慢. ...

  2. 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法

    说明 1.分享页更新后,浏览器总是有缓存,须手动清理才能加载修改后的CSS和JS,故在加载地址后动态添加一个随机数(或时间戳)来确保每次加载的文件都不同来消除缓存. 2.在加载js文件时,被加载js文 ...

  3. ajax 自动清缓存,ajax 清除缓存

    $.ajax({ url : actionUrl , beforeSend :function(xmlHttp){  // deforeSend 是请求前清除缓存  ,如果没有缓存也不使用before ...

  4. Android缓存处理和清除数据、清除缓存、一键清理的区别

      在Android设备中,我们经常会看到与系统或者应用相关的清除功能有:清除数据.清除缓存.一键清理,这么多清除功能对于一个程序猿就够难理解了,偏偏很多安卓设备上都有这些功能,对于用户来说就更难理解 ...

  5. Android应用程序文件缓存getCacheDir()和getExternalCacheDir()

    如果Android引用程序需要缓存临时文件,系统提供了一个可管理的"内部缓存"和一个不可管理的"外部缓存",分别调用getCacheDir()和getExter ...

  6. flask html css文件更改后(谷歌)浏览器不及时更新样式文件怎么办?(ctrl+shift+delete清除缓存的图片和文件)

    如果是css文件更改后 以谷歌浏览器为例 按ctrl+shift+delete 清除缓存的图片和文件,再按f5刷新浏览器,搞定! 但是如果是html文件更改,就要重新启动一下后端flask程序了

  7. android 清除应用程序数据,Android – 通过“清除数据”设置选项阻止正在删除的应用程序数据或文件...

    我有一个Android应用程序,可以在少量文件中存储大约25-40K的私有应用程序数据. 默认情况下,系统将这些文件存储在目录/ data / data /'my app package'/ file ...

  8. 清楚linux缓存文件,Linux删除文件 清除缓存

    相信很多测试 经常会经历开发叫你清除缓存这种事. 那我们要怎么清呢? 一.首先,确认你要清除的缓存在哪个目录下,然后切换到该目录下,比如 我现在知道我的的缓存目录是在newerp这个目录下,则如图 二 ...

  9. 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题

    一.缓存带来的问题和原因 我们在发布新版本的时候,在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时,常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了,那么为什么会存在这个问 ...

最新文章

  1. 实现Activity的滑动返回效果
  2. 矩阵快速幂---BestCoder Round#8 1002
  3. 重磅!教育部撤销518个高校专业
  4. 如何快速获取properties中的配置属性值
  5. SpringMVC-01-基本组件与注解式编程
  6. 揭秘!开源软件背后的神秘组织
  7. 想知道CSDN积分怎么获取谢谢啦 需要下载文件
  8. 正则表达式应用(日期正则表达式)
  9. Premiere Pro之视频升格降格(六)
  10. dcb模式(dcb模式)
  11. 什么是数据驱动业务?
  12. 免费天气预报查询 API、历史天气查询 API 接口使用示例【源码可用】
  13. 精神小伙: 写代码是世界上最好的工作, 不接受反驳
  14. 从零开始的Java再学习-DAY10
  15. leetcode find kth
  16. POJ 1583 Choose Your Words Carefully G++
  17. Python学习-批量提取图片名称保存至txt文件
  18. 电脑代码查询四级准考证
  19. 永别了,中冶京城,永别了,北京
  20. 用地图来表达对棒球或篮球的喜爱

热门文章

  1. 民航飞行学院计算机学院院长,中国民航飞行学院计算机学院领导及老师到访四川华迪开展教研活动...
  2. python网络爬虫_Python即时网络爬虫:API说明
  3. python中re模块_Python中re(正则表达式)模块学习
  4. linux 内存型号 ddr,请问这内存到底是DDR一代还是二代的?
  5. Linux 内核中的数据结构:双链表,基数树,位图
  6. FD.io VPP 20.09版本正式发布:往期VPP文章回顾+下载地址+相关链接
  7. 【转】C++从零实现神经网络
  8. tps波动很大的原因_情绪波动很大是什么原因?怎么调节?
  9. 单片机modbus rtu通讯_【原创】永宏PLC系列RS485通讯方式
  10. Python组合数据类型:容器类型转换,list←→tuple←→set