Cannot display android camera picture on screen or upload it to the server

Hello, everyone. I have been struggling for a few days with taking a photo with the phone camera and sending it to the server in a post request. I read a lot of posts with similar problems, but none of the solutions worked for me. I want to mention that I am quite new to the ionic world, so I am still learning. Maybe it is a stupid problem that I cannot see. This is my code:

 constructor(private camera: Camera, private helperService: HelperService,
    private httpClient: HttpClient, private DomSanitizer: DomSanitizer) {
  }

  image;
  imageData;

  ngOnInit() {
  }

  openCamera() {
    const options: CameraOptions = {
      quality: 50,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE,
    }
    this.camera.getPicture(options).then((imageData) => {
      this.imageData = imageData;
      this.image = (<any>window).Ionic.WebView.convertFileSrc(imageData);
      //extra http://localhost/file.. and I slice it to remove extra chars
      this.image = this.image.slice(27);
    },
      (err) => {
        this.helperService.showAlert(JSON.stringify(err));
      });
  }

  upload() {
    let url = 'url/to/post';
    const date = new Date().valueOf();
    const imageName = date + '.jpeg';
    console.log(this.imageData); ---> undefined
    //slice it to remove extra chars
    this.imageData = this.imageData.slice(27);
    const imageBlob = this.dataURItoBlob(this.imageData);
    const imageFile = new File([imageBlob], imageName, { type: 'image/jpeg' });
    let postData = new FormData();
    postData.append('file', imageFile);
    let data: Observable<any> = this.httpClient.post(url, postData);
    data.subscribe((result) => {
      this.helperService.showSuccess(result);
    });
  }

  dataURItoBlob(dataURI) {
    const byteString = window.atob(dataURI);
    const arrayBuffer = new ArrayBuffer(byteString.length);
    const int8Array = new Uint8Array(arrayBuffer);
    for (let i = 0; i < byteString.length; i++) {
      int8Array[i] = byteString.charCodeAt(i);
    }
    const blob = new Blob([int8Array], { type: 'image/jpeg' });
    return blob;
  }

And here is the .html file where I want to display the picture. This step is quite optional because the thing that I want to accomplish is sendin the image to the backend. But, anyway I will add the html file:

<ion-content>
    <ion-grid>
        <img [src]="DomSanitizer.bypassSecurityTrustUrl(image)">
    </ion-grid>
    <ion-button (click)="upload()" color="success">
        <ion-icon slot="icon-only" name="checkmark"></ion-icon>
    </ion-button>
</ion-content>

This are my dependencies:

"dependencies": {
    "@angular/common": "~8.2.14",
    "@angular/core": "~8.2.14",
    "@angular/forms": "~8.2.14",
    "@angular/platform-browser": "~8.2.14",
    "@angular/platform-browser-dynamic": "~8.2.14",
    "@angular/router": "~8.2.14",
    "@auth0/angular-jwt": "^4.0.0",
    "@capacitor/cli": "^2.0.2",
    "@capacitor/core": "^2.0.2",
    "@ionic-native/base64": "^5.25.0",
    "@ionic-native/camera": "^5.25.0",
    "@ionic-native/core": "^5.0.7",
    "@ionic-native/file": "^5.25.0",
    "@ionic-native/file-path": "^5.25.0",
    "@ionic-native/ionic-webview": "^5.25.0",
    "@ionic-native/splash-screen": "^5.0.0",
    "@ionic-native/status-bar": "^5.0.0",
    "@ionic/angular": "^5.0.0",
    "@ionic/pwa-elements": "^1.5.2",
    "@ionic/storage": "^2.2.0",
    "com-badrit-base64": "^0.2.0",
    "cordova-android": "^8.1.0",
    "cordova-browser": "^6.0.0",
    "cordova-plugin-camera": "^4.1.0",
    "cordova-plugin-file": "^6.0.2",
    "cordova-plugin-filepath": "^1.5.8",
    "cordova-plugin-ionic-webview": "^4.2.1",
    "cordova-sqlite-storage": "^5.0.0",
    "core-js": "^2.5.4",
    "crypto-md5": "^1.0.0",
    "rxjs": "~6.5.1",
    "ts-md5": "^1.2.7",
    "tslib": "^1.9.0",
    "zone.js": "~0.9.1"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.803.20",
    "@angular/cli": "~8.3.23",
    "@angular/compiler": "~8.2.14",
    "@angular/compiler-cli": "~8.2.14",
    "@angular/language-service": "~8.2.14",
    "@ionic/angular-toolkit": "^2.1.1",
    "@types/jasmine": "~3.3.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "codelyzer": "^5.0.0",
    "cordova-plugin-device": "^2.0.2",
    "cordova-plugin-ionic-keyboard": "^2.2.0",
    "cordova-plugin-splashscreen": "^5.0.2",
    "cordova-plugin-statusbar": "^2.4.2",
    "cordova-plugin-whitelist": "^1.3.3",
    "jasmine-core": "~3.4.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.1.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.4.0",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.15.0",
    "typescript": "~3.4.3"
  },
  "description": "An Ionic project",
  "cordova": {
    "plugins": {
      "cordova-sqlite-storage": {},
      "cordova-plugin-whitelist": {},
      "cordova-plugin-statusbar": {},
      "cordova-plugin-device": {},
      "cordova-plugin-splashscreen": {},
      "cordova-plugin-ionic-keyboard": {},
      "cordova-plugin-ionic-webview": {
        "ANDROID_SUPPORT_ANNOTATIONS_VERSION": "27.+"
      },
      "cordova-plugin-camera": {},
      "cordova-plugin-file": {},
      "com-badrit-base64": {},
      "cordova-plugin-filepath": {}
    },
    "platforms": [
      "android",
      "browser"
    ]
  }

As a remark, I tried to display the photo with and without the dom optimizier and using different formats, but none worked. I am using Android 10.

Extra: Please do not take into consideration the fact that my code is quite ugly. I will divide the logic into a different service, but right now I wanted to try the code in a single file to see if I manage to make it work properly.

Problems:
First of all, the picture is not displayed on the screen.
Second of all, when I want to pass the picture to the post request, at the const imageBlob = this.dataURItoBlob(this.imageData); line, this.imageData is undefined.

Please help me, I do not know what to try anymore. Thanks!

I managed to display the image on the screen by adding:

let b64 = 'data:image/jpeg;base64,' + imageData;
      this.image = b64;

instead of

this.image = (<any>window).Ionic.WebView.convertFileSrc(imageData);

Unfortunately, the upload part is still not working.

Somebody has an idea how to send my image to the node.js server? I really need to make this work. Please :slight_smile: