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

一.简介

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

二.文件的保存

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

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

cordova-plugin-file

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

cordova-plugin-file-opener2

上面两个插件filefile-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平台的方法)。

unable to merge dex.png

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.requested
        if (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')){//ios
    path = 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;
  //获取fileName
  let fileName;
  fileName = url.substring(url.lastIndexOf('/') + 1,url.length);
  //获取路径
  let path;
  if(that.platform.is('ios')){//ios
    path = that.file.cacheDirectory;
  }else {
    path = that.file.externalCacheDirectory;
  }
  path = path + "myFile/";
  //第一次下载之后,需要先保存才能打开
  that.file.writeFile(path, fileName,blob, {
    replace: true
  }).then(()=>{
    console.log("--writeFile success--");
    //open
    let 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成功的话,successfail的回调都会相应,不知道算不算file插件的bug

三.清除缓存

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

caculateCacheSize(){

  let that = this;
  //获取路径
  let path;
  if(that.platform.is('ios')){//ios
    path = 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){//MB
      tempSize = Math.floor(tempSize * 100)/100;
      this.sizeStr = tempSize + "MB";
    }else {//GB
      tempSize = Math.floor(tempSize * 100)/100;
      this.sizeStr = tempSize/1024 + "GB";
    }
    console.log("---sizeStr---" + this.sizeStr);
}

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

清除缓存:

clearCache(){
  if(this.device.platform == null) {
    this.methodsProvider.showToast("请在真实的手机设备上清除缓存");
    return;
  }
  let that = this;
  //获取路径
  let path;
  if(that.platform.is('ios')){//ios
    path = 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的数据清除,如果还有其他的清除,请各位给我留言,大家共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349