Sunday, March 25, 2018

Ionic Cordova Camera Upload File using XHR instead of File Transfer Plugin

Leave a Comment

I am using Cordova Camera Plugin in Ionic 1 (Angular 1.3) and I need to upload this image to the server. Since the cordova-plugin-file-transfer is now deprecated and it is recommended to now upload the file using xhr and cordova-plugin-file, I am stuck here on how to proceed. I couldnt find any examples on this and the link I read for this did not help me on how I can upload the imageUrl gotten from Cordova Camera Plugin. This is what I have so far:

function openCamera() {             var options = {                   quality: 50,                   destinationType: Camera.DestinationType.FILE_URI,                   sourceType: Camera.PictureSourceType.CAMERA,                   allowEdit: true,                   encodingType: Camera.EncodingType.JPEG,                   mediaType: Camera.MediaType.PICTURE,                   correctOrientation: true              }             var func = fileTransfer;              navigator.camera.getPicture(function cameraSuccess(imageUri) {                 console.log(imageUri);                 // Upload the picture                 func(imageUri);              }, function cameraError(error) {                 console.debug("Unable to obtain picture: " + error, "app");              }, options); }  function fileTransfer(imageUri) {           window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) {               console.log('file system open: ' + fs.name);               fs.root.getFile(imageUri, { create: true, exclusive: false }, function (fileEntry) {                   fileEntry.file(function (file) {                       var reader = new FileReader();                       reader.onloadend = function() {                           // Create a blob based on the FileReader "result", which we asked to be retrieved as an ArrayBuffer                           var blob = new Blob([new Uint8Array(this.result)], { type: "image/jpg" });                           var oReq = new XMLHttpRequest();                           var server = 'http://serverurl.com/upload.php';                           oReq.open("POST", server, true);                           oReq.onload = function (oEvent) {                               // all done!                           };                           // Pass the blob in to XHR's send method                           oReq.send(blob);                       };                       // Read the file as an ArrayBuffer                       reader.readAsArrayBuffer(file);                   }, function (err) { console.error('error getting fileentry file!' + JSON.stringify(err)); });               }, function (err) { console.error('error getting file! ' + JSON.stringify(err)); });           }, function (err) { console.error('error getting persistent fs! ' + JSON.stringify(err)); }); } 

I understand the fileTransfer() is wrong here since I have just used what I read in the link and I cant expect to magically work. I have no idea on how I can use the imageUrl I got from navigator.camera.getPicture and upload it using Ajax in Angular 1.3.

The above code fails in error getting file! {"code":5}.

Can someone help me please?

1 Answers

Answers 1

Instead of using file path you can try below solution.

function b64toBlob(b64Data, contentType, sliceSize) {          contentType = contentType || '';         sliceSize = sliceSize || 512;          var byteCharacters = atob(b64Data);         var byteArrays = [];           for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {             var slice = byteCharacters.slice(offset, offset + sliceSize);              var byteNumbers = new Array(slice.length);             for (var i = 0; i < slice.length; i++) {                  byteNumbers[i] = slice.charCodeAt(i);             }              var byteArray = new Uint8Array(byteNumbers);              byteArrays.push(byteArray);         }          var blob = new Blob(byteArrays, { type: contentType });         return blob;     } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment