Install src from img from dataDirectory file path

I am trying to install src

from <img>

to html from a string file path.

The path is taken from the cordova.file.dataDirectory

cordova plugin to Ionic2

( Typescript

) and looks like this:

EDIT MY CODE:

This is the relevant part of the profile.ts code

...
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)
        })
    })

  }

}

      

This is the corresponding image codeAdquisitionService

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;
    }
  }

}

      

This is the corresponding api service code

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);

  }

      

And this is the relevant html code

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

      

This is an example with a default sample encrypted with:

this.imagepath = "./assets/img/pio.jpg"

enter image description here

This is an example where programmatically changing the path to

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

enter image description here

thank

+3


source to share


3 answers


I had the same problem. I realized that although I was working on an Android device, I was running it in ionic mode, which does not work with cordova plugins. So instead of executing, ionic cordova run android -l -c

I had to run it as ionic cordova android

.



+3


source


This is not the case anyway. [src]="this.imagepath"

... Don't need to be used this

here.

You can try as shown below.



file.html

[src]="imagepath"

      

0


source


You don't need to use this

internally [src]="this.imagepath"

.

I think,

[src]="imagepath"

      

or

src={{imagepath}}

      

will work fine.

NOTE . This works if it file:///usr...package....image.jpg

is a valid path.

0


source







All Articles