0

I am building a Mobile App using Ionic / Angular JS. In a specific tab, the user has the ability to fill a form and select a picture using ngCordova Camera Plugin and send the form. I would like to send all the form details to www.mydomain.com/receive.php.

Here is how my HTML file for that specific tab looks like:

<ion-view view-title="Form">
  <ion-content>
    <div class="list">
        <div class="item item-divider">
          Personal Details
        </div>
        <label class="item item-input">
          <span class="input-label">Name</span>
          <input name="fname" type="text" placeholder="John">
        </label>
        <label class="item item-input">
          <span class="input-label">Surname</span>
          <input name="lname" type="text" placeholder="Smith">
        </label>
        <label class="item item-input">
          <span class="input-label">Email</span>
          <input name="email" type="email" placeholder="[email protected]">
        </label>
        <label class="item item-input">
          <span class="input-label">Phone</span>
          <input name="phone" type="tel" placeholder="555234567">
        </label>
        <div class="item item-divider">
          Location
        </div>
        <button class="button button-full button-balanced" ng-click="getLocation()"><i class="ion-android-locate"></i> Get my location</button>
        <label class="item item-input">
          <span class="input-label">Street</span>
          <input name="street" type="text" ng-model="pStreet.value">
        </label>
        <label class="item item-input">
          <span class="input-label">Number</span>
          <input name="number" type="text" ng-model="pNumber.value">
        </label>
        <label class="item item-input hidden">
          <span class="input-label">Lat</span>
          <input name="lat" type="text" ng-model="pLat.value">
        </label>
        <label class="item item-input hidden">
          <span class="input-label">Lng</span>
          <input name="lng" type="text" ng-model="pLng.value">
        </label>
        <label class="item item-input hidden">
          <span class="input-label">Address</span>
          <input name="address" type="text" ng-model="pAddress.value">
        </label>
        <div class="item item-divider">
          Photo
        </div>
        <div class="item">
          <div class="row">
            <div class="photo">
              <button ng-click="selectPicture()">Select Picture</button>
              <img id="myImage" style="width: 100%; height: auto;"/>
            </div>
          </div>
        </div>
        <button class="button button-full button-positive" ng-click="">Send form</button>
      </div>
  </ion-content>
</ion-view>

And here is the Controller JS for the tab:

.controller('PetitionsCtrl', function($scope, $cordovaGeolocation, $cordovaCamera, $log, $ionicLoading, $http, $timeout, $compile) {

  $scope.getLocation = function() {
    $ionicLoading.show({
      templateUrl: 'loading.html',
      hideOnStateChange: true
    });
      var posOptions = {timeout: 15000, enableHighAccuracy: true};
      $cordovaGeolocation
      .getCurrentPosition(posOptions)
      .then(function (position) {
        $scope.lat = position.coords.latitude;
        $scope.lng = position.coords.longitude;
        $scope.pLat = {value: $scope.lat};
        $scope.pLng = {value: $scope.lng};

        var geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng($scope.lat, $scope.lng);
        var request = {
          latLng: latlng
        };

        geocoder.geocode(request, function(data, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (data[0] != null) {
              $scope.$apply(function () {
                $scope.pStreet = {value: data[0].address_components[0].types[0] === 'route' ? data[0].address_components[0].long_name : data[0].address_components[1].long_name};
                $scope.pNumber = {value: data[0].address_components[0].types[0] === 'street_number' ? data[0].address_components[0].long_name : ''};
                $scope.pAddress = {value: data[0].formatted_address};
                setTimeout(function () {
                  $ionicLoading.hide();
                }, 500);
              });
            } else {
              setTimeout(function () {
                $ionicLoading.hide();
              }, 500);
            }
          }
        })
      });
    };

    $scope.selectPicture = function() {

      var options = {
        quality: 90,
        destinationType: Camera.DestinationType.DATA_URL,
        sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
        allowEdit: false,
        encodingType: Camera.EncodingType.JPEG,
        popoverOptions: CameraPopoverOptions,
        saveToPhotoAlbum: false,
        correctOrientation: true
      };

      $cordovaCamera.getPicture(options).then(function(imageData) {
        var image = document.getElementById('myImage');
        image.src = "data:image/jpeg;base64," + imageData;
      }, function(err) {
        // err
      });

    }

})

I am a noob when we are talking about Ionic / Angular (expert on PHP so I will take care of that). How can I pass my form details, including the imageDate to the PHP?

5
  • Hello, have you thought of reading the image using a canvas/other method and packing it in a hidden field? Then you could send it back to the server using the form without extra work Commented Nov 24, 2016 at 13:28
  • Yes, I tried to create a hidden field like this: <input name="photo" type="text" ng-model="pPhoto.value"> and added this in the Controller.JS: $scope.pPhoto = {value: "data:image/jpeg;base64," + imageDat}; but it doesn't work. Commented Nov 24, 2016 at 13:31
  • Does it give you an error? Can you share the rest of the code? Commented Nov 24, 2016 at 13:33
  • No errors but the field is not populated with data. Here is the updated code: jsfiddle.net/r0pcetf4 Commented Nov 24, 2016 at 13:38
  • My guess is you might need to do a $scope.apply() after assigning the value to pPhoto - since you are in a "non-angular" callback. But i might be mistaken. Commented Nov 24, 2016 at 15:42

2 Answers 2

2

Andrei.

You need to bind each html input model. ex.

    <label class="item item-input">
      <span class="input-label">Name</span>
      <input name="fname" type="text" placeholder="John" ng-model="myForm.fname">
    </label>
    <label class="item item-input">
      <span class="input-label">Surname</span>
      <input name="lname" type="text" placeholder="Smith" ng-model="myForm.lname">
    </label>

Your controller.

  $cordovaCamera.getPicture(options).then(function(imageData) {
    var image = document.getElementById('myImage');
    image.src = "data:image/jpeg;base64," + imageData;

    // You want to send the data
    $rootScope.data = {
      src : "data:image/jpeg;base64," + imageData,
      fname : $scope.myForm.fname,
      lname : $scope.myForm.lname
    }
  }, function(err) {
    // err
  });

Your $http.

var url = "www.mydomain.com/receive.php";
      $http({
        method: 'POST',
        data: $rootScope.data,
        url: url
      }).
      then(function (response) {
         //ok
      }, function (response) {
         //fail
      });

Your PHP.

$src = $_REQUEST['src'];
$fname = $_REQUEST['fname'];
$lname = $_REQUEST['lname'];

This code can save your images.

    $base64_string_img = $src;
    $data = explode(',', $base64_string_img);
    $filename_path = md5(time() . uniqid()) . ".jpg";
    $decoded = base64_decode($data[1]);
    file_put_contents("uploads/" . $filename_path, $decoded);
Sign up to request clarification or add additional context in comments.

Comments

0

we are using a plugin to do that, it's the easiest way: https://github.com/apache/cordova-plugin-file-transfer

Per documentation:

var win = function (r) {
    console.log("Code = " + r.responseCode);
    console.log("Response = " + r.response);
    console.log("Sent = " + r.bytesSent);
}

var fail = function (error) {
    alert("An error has occurred: Code = " + error.code);
    console.log("upload error source " + error.source);
    console.log("upload error target " + error.target);
}

var options = new FileUploadOptions();
options.fileKey = "file";
options.fileName = fileURL.substr(fileURL.lastIndexOf('/') + 1);
options.mimeType = "text/plain";

var params = {};
params.value1 = "test";
params.value2 = "param";

options.params = params;

var ft = new FileTransfer();
ft.upload(fileURL, encodeURI("http://some.server.com/upload.php"), win, fail, options);

1 Comment

Saw this plugin already. The problem is that this plugin sends the only the file. I need to post all other fields details too.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.