Ionic 3 Native:文件:代码:5,消息:“ENCODING_ERR”

Posted

技术标签:

【中文标题】Ionic 3 Native:文件:代码:5,消息:“ENCODING_ERR”【英文标题】:Ionic 3 Native : File : code: 5, message: "ENCODING_ERR"Ionic 3 Native:文件:代码:5,消息:“ENCODING_ERR” 【发布时间】:2018-02-05 05:20:55 【问题描述】:

我在 Ionic 3 中使用checkFile function from File API plugin 来检查本地是否存在文件。 Promise 拒绝并出现以下错误:

FileError code: 5, message: "ENCODING_ERR"

根据我在Mozilla Docs of the File API 上看到的情况,问题是“URL 格式错误”。但是,我看不到 URL 的格式错误。以下是显示我如何调用函数的相关代码以及所涉及变量的实际值(baseDirectory 的值设置为file:///data/user/0/ch.protectator.fehpedia/files/):

let baseDirectory = this.file.dataDirectory;
let fileToCheck = "File:Icon Portrait Abel.png";

let promise = this.file.checkFile(this.file.dataDirectory, fileName).then(bool => 
    // Things
, reason => 
    console.error(reason);
);

这就是失败的 Promise。这种情况的奇怪之处在于,我实际上试图稍后在代码中显示该图像,忽略 File.checkFile 是否已找到它,并且 图像显示

html 模板中,我稍后使用:

<img [src]="imgUrl">

其中imgUrl 使用:

this.imgUrl = this.file.dataDirectory + '/' + "File:Icon Portrait Abel.png";

所以图像存在并在被 WebView 调用时正确显示,但是 Native File 插件告诉我 URL 格式错误,即使对我来说它似乎是完全相同的 URL。那就是我卡住的地方,我不知道要更改什么才能使代码正常工作。 checkFile 应该以不同的方式使用吗?此外,更准确的失败原因会有所帮助,但我得到的只是ENCODING_ERR,我不知道 URL 的哪个实际部分看起来格式不正确。

【问题讨论】:

你从哪里得到这个值this.file.dataDirectory?你也可以展示一下代码吗? this.file 被注入到类的构造函数中,它是来自 Ionic Native API 的 File 类。因此,dataDirectory 是 ionicframework.com/docs/native/file/#dataDirectory 【参考方案1】:

在查看了类似案例后,我没有找到有关此特定案例的解决方案或文档。但是在尝试不同的值时,我发现了导致此错误的原因:。是的,结肠。文件名中的那个。

虽然我仍然无法解释 为什么 : 会导致原生 File 插件失败,但不会导致 Web 视图失败,但从文件名中删除 : 可以有效地允许 File无需提出ENCODING_ERR 即可查看。虽然这不是最佳解决方案,但此解决方法是有效的。

【讨论】:

"虽然我仍然无法解释为什么:导致本机文件插件失败" 冒号 (:) 是一个保留字符,不能在 Windows 系统的文件名中使用(但可以在Linux 系统)。也许是为了兼容性,文件插件保留了 Windows 和 Linux 系统上的所有字符。 (文件名中禁止使用的字符列表)[***.com/a/31976060/4511424] 我遇到了同样的问题。这并没有解决我的问题,但对于那些遇到它的人:我删除了我所有的平台 ionic cordova platform rm ios,删除了 plugins 目录并重新添加了 ios 平台,它再次工作 如果我们使用 base64 概念,我们该如何处理,例如数据:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,UEsD....... ?【参考方案2】:

在我的例子中,我让“File:///”在路由中,现在它可以工作了。

【讨论】:

【参考方案3】:

没有一个答案能解决我的问题。这很简单,我在 iOS 中使用了错误的目录来保存文件。我正在使用“缓存”,但一直收到错误

我改成

this.file.tempDirectory;

并且成功了!

【讨论】:

【参考方案4】:

只需先创建简单文件名进行交叉检查。

就我而言,我使用的文件名不是正确的文件名。

出现同样错误的代码

    const fileName = localStorage.getItem(appGlobals.UserData.email) + '_' + new Date() + '.mp3';
this.file.createFile(this.file.dataDirectory, fileName, true)
.then((fileEntry: FileEntry) => 
  //do something with the file
).catch(err => 
  alert(JSON.stringify(err));
);

修改后的代码

    const fileName = localStorage.getItem(appGlobals.UserData.email) + '_' + new Date().getTime() + '.mp3';
this.file.createFile(this.file.dataDirectory, fileName, true)
.then((fileEntry: FileEntry) => 
// do something with the file
).catch(err => 
  alert(JSON.stringify(err));
);

【讨论】:

【参考方案5】:

确保您指向正确的目录以根据平台保存文件。我创建了这个实用程序来获取适用于 android 和 iOS 的正确目录:

    getDeviceDirectoryToSaveFile(): string 
     if (this.platform.is('android')) 
      return this.file.externalDataDirectory;
      else if (this.platform.is('ios')) 
      return this.file.applicationStorageDirectory+"/Documents";
     
    

【讨论】:

【参考方案6】:

就我而言,这对我有用

resolveLocalFileSystemURL(`$cordova.file.externalDataDirectory.replace(/^file:\/\//g, '')record252202022149.3gp`, function(entry)  
    console.log(entry);
, (e) => console.error(e))

【讨论】:

以上是关于Ionic 3 Native:文件:代码:5,消息:“ENCODING_ERR”的主要内容,如果未能解决你的问题,请参考以下文章

解决 no compatible version found: ionic-native@^3.5.0

IONIC 3 无法使用@ionic-native/file-opener 在 Android 中打开 PDF 文件

使用 Firebase 云消息传递的 Ionic Native Push 崩溃

Ionic Native 视频上传损坏的文件

更新到 ionic-native 2.5.1 后的 ionic 2 Typescript 错误 TS1005

ionic 3本机存储读取值存储