代码之家  ›  专栏  ›  技术社区  ›  William Terrill

Ionic V4(beta 11)文件插件似乎不能很好地与V4配合使用

  •  1
  • William Terrill  · 技术社区  · 8 年前

    不幸的是,我不能让它在V4中工作。。。但它在V3中工作。我认为V4为了将路径绑定到src属性(?)而解释路径的方式可能有问题

    TS文件:

    import { Component, OnInit } from '@angular/core';
    import { FileTransfer, FileTransferObject } from '@ionic-native/file-transfer/ngx';
    import { File } from '@ionic-native/file/ngx'
    
    @Component({
      selector: 'app-scratch2',
      templateUrl: './scratch2.page.html',
      styleUrls: ['./scratch2.page.scss'],
    })
    export class Scratch2Page implements OnInit {
      private address: string = null;
      private path: string = null;
      private fileNumber = 1;
      private latest = null;
      private toggle = false;
    
      constructor(
        private fileX: FileTransfer,
        private file: File
      ) { 
        this.path = this.file.dataDirectory + "files/";
      }
    
      ngOnInit() {
        let filename = this.nameFile()
        this.latest = this.nameFix(filename)
        console.log("1the filename that is returned is ********** ", filename)
      }
    
      nameFile(){
        let filename = this.path + "file" + this.fileNumber
        return filename
      }
    
      nameFix(filename){
        return filename.replace(/file:\/\//g, "")
      }
    
      downloadFile() {
        let filename = this.nameFile();
        console.log("2the filename that is returned is ********** ", filename)
        console.log("Entered download File with url: ", this.address)
        let url = this.address
        const fileTransfer: FileTransferObject = this.fileX.create();
        fileTransfer.download(url, filename).then((entry) => {
            console.log('fileTransfer.download data ** ** ** **:' + JSON.stringify(entry));
            this.fileNumber += 1;
            this.latest = this.nameFix(filename)
        }, (err) => {
          // handle error
          console.log("downloadfile() error: " + JSON.stringify(err));
        });
      }
    
      toggleToggle(){
        this.toggle = !this.toggle;
    
      }
    
    }
    

        <ion-header>
      <ion-toolbar>
          <ion-buttons slot="start">
              <ion-back-button defaultHref="/"></ion-back-button>
            </ion-buttons>
        <ion-title>scratch2</ion-title>
      </ion-toolbar>
      <ion-toolbar>{{latest}} {{toggle}}</ion-toolbar>
    </ion-header>
    
    <ion-content padding>
        <ion-item>
            <ion-label>Address</ion-label>
            <ion-input placeholder="Enter address" [(ngModel)]="address"></ion-input>
          </ion-item>
          <ion-button (click)="downloadFile()"> Download from address</ion-button>
          <ion-button (click)="toggleToggle()">Toggle</ion-button>
    
        <img *ngIf="toggle" [src]="latest"/>
    </ion-content>
    

    任何帮助都将不胜感激

    1 回复  |  直到 8 年前
        1
  •  0
  •   William Terrill    8 年前

    文件结构确实发生了变化,文件本身可以通过Web服务器而不是直接访问。这是在以下链接中讨论的: https://ionicframework.com/docs/wkwebview/

    当您要将文件下载到手机上时,可以使用以下两种路径进行下载,一种用于下载文件,另一种用于显示下载的文件:

    this.downloadPath = this.file.dataDirectory + "filename.jpg"
    this.showFilePath = normalizeURL(this.file.dataDirectory + "filename.jpg")
    

    其中normalizeURL的导入方式为:import{normalizeURL}from;

    所以,我重写了上面的代码如下:

    import { Component, OnInit } from '@angular/core';
    import { FileTransfer, FileTransferObject } from '@ionic-native/file-transfer/ngx';
    import { File } from '@ionic-native/file/ngx'
    import { normalizeURL } from "ionic-angular";
    
    @Component({
      selector: 'app-scratch2',
      templateUrl: './scratch2.page.html',
      styleUrls: ['./scratch2.page.scss'],
    })
    export class Scratch2Page implements OnInit {
      private address: string = null;
      private path: string = null;
      private toggle = false;
      private showPath = null;
      private downloadPath = null
    
      constructor(
        private fileX: FileTransfer,
        private file: File
      ) {
        this.path = this.file.dataDirectory + "files/";
        this.downloadPath = this.path + "beer.jpg"
        this.showPath = normalizeURL(this.path + "beer.jpg")
      }
      ngOnInit() {
      }
    
      downloadFile() {
        console.log("Entered download File with url: ", this.address)
        let url = this.address
        const fileTransfer: FileTransferObject = this.fileX.create();
        fileTransfer.download(url, this.downloadPath).then((entry) => {
          console.log('fileTransfer.download data ** ** ** **:' + JSON.stringify(entry));
        }, (err) => {
          console.log("downloadfile() error: " + JSON.stringify(err));
        });
      }
    
      toggleToggle() {
        this.toggle = !this.toggle;
      }
    }
    

    HTML文件

    <ion-header>
      <ion-toolbar>
        <ion-buttons slot="start">
          <ion-back-button defaultHref="/"></ion-back-button>
        </ion-buttons>
        <ion-title>scratch2</ion-title>
      </ion-toolbar>
      <ion-toolbar>toggle:{{toggle}} <br><br> download path:<br>{{downloadPath}} <br><br> Show path:<br>{{showPath}}</ion-toolbar>
    </ion-header>
    <ion-content padding>
      <ion-item>
        <ion-label>http address of jpg:</ion-label>
        <ion-input placeholder="Enter address" [(ngModel)]="address"></ion-input>
      </ion-item>
      <ion-button (click)="downloadFile()"> download jpg</ion-button>
      <ion-button (click)="toggleToggle()">Toggle</ion-button>
      <img *ngIf="toggle" src="{{showPath}}" />
    </ion-content>
    

    在iPhone模拟器上,下载路径如下所示:

    file:///Users/myUserName/Library/etc etc etc
    

    http://localhost:8080/_file_/Users/myUserName/Library/etc etc etc