从 dataDirectory 文件路径设置为 img 的 src

Han*_*nzo 3 image typescript cordova-plugins ionic2

我正在尝试从文件的字符串路径在 html 上设置srca 。<img>

该路径是从( )cordova.file.dataDirectory上的 cordova 插件获取的,如下所示:Ionic2Typescript

编辑以显示我的代码:

这是 profile.ts 代码的相关部分

...
import {Camera} from "ionic-native";
...
import {API} from "../../services/api";
import {ImageAdquistionService} from "../../services/imageAdquisition.service";
...
import {Network,File} from 'ionic-native';




declare let cordova: any;


@Component({
  selector:    'page-profile',
  templateUrl: 'profile.html'
})

export class ProfilePage implements OnInit{


  connected:boolean = false;

  imagePath: string = "./assets/img/pio.jpg";
  userInfo: User = new User();


  constructor(

              private api:API,
              private imageAdquistionService: ImageAdquistionService,
              ){

    //seleted tab by default
    this.tabs="info";

    this.connected = Network.type !== "none";

  }

  ngOnInit(): void {

    this.localStorageService.getUserInfo().then(user => {
      this.userInfo = user;
      if (this.userInfo.imagenPerfil !== "defAlert") {

        File.checkFile(cordova.file.dataDirectory,this.userInfo.profileImage).then(result => {
         console.log("exist")
          this.imagePath = cordova.file.dataDirectory + this.userInfo.profileImage;
         })
         .catch(error => {
         console.log("not exist " + JSON.stringify(error))
         })
      }
    });

  }

  presentImageOptions(){

    let actionSheet = this.actionSheetCtrl.create({
      title: 'Select an option',
      buttons: [
        {
          icon: 'camera',
          text: 'photo',
          handler: () => {

            let navTransition = actionSheet.dismiss();
            navTransition.then(() => {
              this.imageAdquistionService.getANewImage(Camera.PictureSourceType.CAMERA).then(imageData => {
                if(imageData.success){
                  this.uploadImage(imageData.fileName, imageData.filePath);
                }
                else{this.presentToast(imageData.message)}
              })
            });
            return false;
          }
        }, {
          icon: 'image',
          text: 'Gallery',
          handler: () => {

            let navTransition = actionSheet.dismiss();
            navTransition.then(() => {
              this.imageAdquistionService.getANewImage(Camera.PictureSourceType.PHOTOLIBRARY).then(imageData => {
                if(imageData.success){
                  this.uploadImage(imageData.fileName, imageData.filePath);
                }
                else{this.presentToast(imageData.message)}
              });
            });
            return false;
          }
        }, {
          text: 'Close',
          role: 'cancel',
          handler: () => {
            console.log('Cancel clicked');
          }
        }
      ]
    });
    actionSheet.present();
  }


  uploadImage(fileName: string, filePath: string){


    this.presentLoadingCustom();
    this.localStorageService.getAccessToken().then(token  => {

      this.api.uploadFile(fileName,filePath).then(result =>{
        this.loading.dismissAll();
        console.log("uploaded OK);

        this.userInfo.profileImage = fileName;
        this.imagePath = filePath;

          this.api.updateUserPreferences(this.userInfo,token).then(result =>{
            if(result.success) {
              console.log("updated ok");

              this.presentToast("image updated succesfully");
            }
          });

      })
        .catch(error => {
          this.presentToast(error.message)
        })
    })

  }

}
Run Code Online (Sandbox Code Playgroud)

这是imageAdquisitionService的相关代码

import { Injectable } from '@angular/core';
import {LocalStorageService} from "./localStorage.service";
import {Platform} from "ionic-angular";
import {Camera, File, FilePath} from "ionic-native";
import {API} from "./api";


declare let cordova: any;

@Injectable()
export class ImageAdquistionService {


  constructor(private storage: LocalStorageService,
              public platform: Platform,
              private api:API) {
  }


  getANewImage(src):Promise<any>{
    let options = {
      quality: 60,
      sourceType: src,
      saveToPhotoAlbum: false,
      correctOrientation: true
    };


    return Camera.getPicture(options).then((imageData) => {

      // Special handling for Android library
      if (this.platform.is('android') && src === Camera.PictureSourceType.PHOTOLIBRARY) {


        return FilePath.resolveNativePath(imageData)
          .then(filePath => {

              let correctPath = filePath.substr(0, filePath.lastIndexOf('/') + 1);
              let currentName = imageData.substring(imageData.lastIndexOf('/') + 1, imageData.lastIndexOf('?'));

                return this.storage.getUserInfo().then(user => {

                    return this.copyFileToLocalDir(correctPath, currentName, this.createFileName(user._id)).then(copyResult => copyResult);


            });

            }, (error) => {
              // Handle error
              return {success: false, message: error.message};
            }
          );
      } else {

        let currentName = imageData.substr(imageData.lastIndexOf('/') + 1);
        let correctPath = imageData.substr(0, imageData.lastIndexOf('/') + 1);

        return this.storage.getUserInfo().then(user => {

            return this.copyFileToLocalDir(correctPath, currentName, this.createFileName(user._id)).then(copyResult => copyResult);

        });
      }
    }, (error) => {
        // Handle error
        return {success: false, message: error.message};
      }
    )
  }
  // Create a new name for the image
  createFileName(id:string) {
    let d = new Date(),
      n = d.getTime(),
      newFileName =  n + ".jpg";

      newFileName = id + "_" + newFileName;
      return newFileName;


  }

// Copy the image to a local folder
  copyFileToLocalDir(namePath, currentName, newFileName):Promise<any> {

    return File.copyFile(namePath, currentName, cordova.file.dataDirectory, newFileName).then(success => {

      console.log("response of copy " + JSON.stringify(success));
      return {success: true, fileName: newFileName, filePath: this.pathForImage(newFileName)};

    }, error => {
      this.api.logIonicView("Error while storing file " + error.message);

      return {success: false, message: error.message};
    });
  }

  // Always get the accurate path to the apps folder
  public pathForImage(img) {
    if (img === null) {
      return '';
    } else {
      return cordova.file.dataDirectory + img;
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

这是api服务的相关代码

uploadFile(name:string, path:string):Promise<any>{

    let options = {
      fileKey: "file",
      fileName: name,
      chunkedMode: false,
      mimeType: "multipart/form-data",
      params : {'fileName': name}
    };

    let fileTransfer = new Transfer();

    // Use the FileTransfer to upload the image

    return fileTransfer.upload(path, this.urlBase + "upload", options)
      .then(data => {
        console.log("message on filetransfer "+ JSON.stringify(data.response));

        data})
      .catch(this.handleError);

  }
Run Code Online (Sandbox Code Playgroud)

这是html代码的相关代码

<ion-item no-lines class="item-bar-profile">
      <ion-avatar>
        <img class="centered" src="imagePath" (click)="presentOptions();">
      </ion-avatar>
</ion-item>
Run Code Online (Sandbox Code Playgroud)

这是一个默认图像路径硬键入的示例:

this.imagepath =“./assets/img/pio.jpg”

在此输入图像描述

这是以编程方式更改路径的示例

this.imagepath = 文件:///data/user/0/com.ionicframework.myionicproject494629/files/58db7e92be26f32d4c8c01d2_1491989021049.jpg

在此输入图像描述

谢谢

ask*_*ndz 5

我也有同样的问题。我意识到,虽然我在 Android 设备上运行,但我是在 ionic 中运行的,它不能与 cordova 插件一起使用。ionic cordova run android -l -c因此,我必须运行命令,而不是这样做ionic cordova run android