2017-05-07 1 views
1

J'essaye d'envoyer un Jpeg de base 64 à une API pour l'analyse OCR.Base 64 Image à ocr.space API Ionic 2

Les API docs peuvent être trouvés ici https://ocr.space/ocrapi

Le code pour enregistrer l'image est ici:

takePicture() { 
    Camera.getPicture({ 
     destinationType: Camera.DestinationType.DATA_URL, 
     targetWidth: 1000, 
     targetHeight: 1000, 
     encodingType: Camera.EncodingType.JPEG, 
     sourceType: Camera.PictureSourceType.CAMERA, 
     allowEdit:true }).then((imageData)=>{ 
     this.base64Image = "data:image/jpeg;base64," + imageData; 
    }); 
} 

Cependant, je suis sûr que cela est bien que la copie la chaîne de base 64 et l'envoi via le facteur fonctionne bien.

Voici comment j'envoie la chaîne à l'API.

post(val) { 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
    headers.append('apikey', 'APIKEY'); 

    let data = 'base64Image=' + val; 
    console.log(data); 
    return this.http.post('http://api.ocr.space/parse/image', data, {headers: headers}) 
     .map(response => response.json()); 
} 

La chaîne de base 64 est transmise à la variable val.

L'erreur donnée est: "image base64 non valide Le format d'image base64 accepté est 'data: image /; base64,'."

Bizarre que cela fonctionne bien chez le facteur .... quelqu'un peut-il repérer ce que je fais mal?

+0

Pourquoi vous 'données apposent: image/jpeg, base64,' 'à la variable base64image'? –

+0

@MariaInesParnisari Je crois que c'est le bon format? – calmcalmuncle

+0

Oui, mais la variable 'imageData' ne l'a-t-elle pas déjà? –

Répondre

3

Le problème est de savoir comment vous envoyez les données. Si vous regardez le Postman collection avec des exemples d'appel API, vous verrez que le base64image est envoyé en tant que form-data.

Postman call

Mais, comme indiqué dans this SO answer,

Lorsque nous voulons afficher la valeur comme un poste de FORM, nous avons besoin de changer l'algorithme de sérialisation et afficher les données avec le Content- tapez, "application/x-www-form-urlencoded".

Donc, ce code devrait fonctionner:

var headers = { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'apikey': 'helloworld' 
}; 
var data = { 
    'base64image': 'data:image/png;base64,iVBORw0KGgoAAAANS...' 
} 

$http({ 
    method: 'POST', 
    url: 'http://api.ocr.space/parse/image', 
    headers: headers, 
    data: data, 
    transformRequest: function(obj) { 
     var str = []; 
     for (var p in obj) 
     str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
     return str.join("&"); 
    }, 
    }) 

démonstration de travail: http://plnkr.co/edit/aPO4UGng7uaMbIqrzc7J

+0

Correction d'une manière plus simple basée sur le code que j'avais déjà, mais votre réponse est très correcte! Merci beaucoup! – calmcalmuncle

+0

@calmcalmuncle s'il vous plaît envisager des réponses upvoting si elles étaient utiles, au lieu de dire merci :) [Plus d'info] (https://meta.stackexchange.com/questions/126180/is-it-acceptable-to-write-a- merci-dans-un-commentaire) – sebaferreras