【问题标题】:Ionic 3 - Native File issuesIonic 3 - 本机文件问题
【发布时间】:2018-03-17 14:02:38
【问题描述】:

在尝试将使用相机拍摄的文件复制到数据存储时,我似乎找不到任何有关错误的信息。这是我的功能(这几乎是每个人都在做的事情):

import { File } from '@ionic-native/file';

// stuff here

constructor(public navCtrl: NavController, public navParams: NavParams, private StorageProvider: StorageProvider, public viewCtrl: ViewController, private camera: Camera, public platform: Platform, private file: File{

}

// other stuff here

copyFileToLocalDir() {

  let d = new Date();
  let n = d.getTime();
  let newFileName =  n + ".jpg";
  console.log('new name',newFileName);

  this.file.copyFile(this.imagePath, this.imageName, cordova.file.dataDirectory, newFileName)
    .then(success => {
      this.lastImage = newFileName;
    }, error => {
      console.log('error saving');
    });
}

导致错误的行是:this.file.copyFile(...

我在模拟器或设备上运行时遇到的错误是: 错误错误:未捕获(承诺):无效操作

离子信息:

cli packages: (/Users/billb/dev/customer-mkt-app/node_modules)

    @ionic/cli-utils  : 1.12.0
    ionic (Ionic CLI) : 3.12.0

global packages:

    cordova (Cordova CLI) : 7.0.1

local packages:

    @ionic/app-scripts : 3.0.0
    Cordova Platforms  : android 6.2.3 ios 4.4.0
    Ionic Framework    : ionic-angular 3.3.0

System:

    Android SDK Tools : 26.1.1
    ios-deploy        : 1.9.0
    ios-sim           : 5.0.10
    Node              : v7.8.0
    npm               : 4.6.1
    OS                : macOS Sierra
    Xcode             : Xcode 9.0 Build version 9A235

Misc:

    backend : legacy

有什么想法吗?此函数 copyFileToLocalDir() 几乎取自 File 插件的几个示例,包括插件编写者。

【问题讨论】:

  • 您是否使用最新版本的 ionic-native? copyFile 方法仅在 ionic-native 中可用,然后转发到“真实”cordova-file 插件的其他方法。也许插件已更改并且 ionic-native 尚未更新。只是猜测:)
  • 是的,它是最新的。文件的 Ionic 页面上显示 copyFile
  • 你在调用函数之前记录了函数调用的参数吗?尤其是cordova.file.dataDirectory 好像有点不对劲。
  • 我已经记录了其中的一些,但我尝试了很多不同的更改,我不记得了。让我再做一次,看看我有什么。
  • 是的,所有参数看起来都正确

标签: android file cordova ionic-framework native


【解决方案1】:

所以从上面大卫的 cmets 中,这促使我进一步挖掘并更好地了解 File 插件在做什么。感谢herehere这两个问题的答案,我终于弄明白了。这是我的最终代码:

copyFileToLocalDir() {
let d = new Date();
let n = d.getTime();
let newFileName =  n + ".jpg";
// cordova.file.dataDirectory
let externalStoragePath: string =  cordova.file.dataDirectory;

this.file.resolveLocalFilesystemUrl(this.imagePath + this.imageName)
  .then((entry: any)=>{
    console.log('entry',entry);

    this.file.resolveLocalFilesystemUrl(externalStoragePath)
      .then((dirEntry: any)=>{

        entry.copyTo(dirEntry, newFileName, this.successCopy, this.failCopy);

      }).catch((error)=>{
        console.log(error);
      });

  }).catch((error)=>{
    console.log(error);
  });

}

您必须创建 2 个对象,一个是当前文件 (entry),另一个是用于将文件复制到的路径 (dirEntry)。这是解决这个问题的关键。

【讨论】:

  • 你能告诉我这些 this.successCopy 和 this.failCopy 是从哪里来的吗
  • 好吧,从 2 1/2 年前开始,我猜测它们是文件对象的一部分。我必须回去挖掘所有这些代码并试着记住我们在这里做了什么。
  • 嘿比尔..感谢您的重播我的问题已通过您的解决方案解决了我刚刚删除了 this.successCopy 和 this.failCopy 并且代码工作正常。再次感谢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2018-02-09
  • 2018-03-28
  • 2017-12-07
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多