Denis L
Denis L

Reputation: 121

Can't send image to azure API

I'm making OCR app using amazon. App I'm doing using react native. And I have an error on the moment when I send data.

Error:

{ "code": "InvalidImageUrl", "requestId": "c495b0d7-a65a-4138-97a9-2b1cb25dced8", "message": "Image URL is badly formatted." }

Why? What am I doing wrong? Code:

// ...

  selectImage() {
    ImagePicker.showImagePicker(options, (response) => {
      if (response.didCancel) {
        console.log('User cancelled image picker');
      } else if (response.error) {
        console.log('ImagePicker Error: ', response.error);
      } else if (response.customButton) {
        console.log('User tapped custom button: ', response.customButton);
      } else {
        const source = { uri: response.uri };
        this.setState({ imageSource: source });
    
        this.extractText(response.uri);
      }
    });
  }

  extractText = async (imageSource) => {

    // alert(imageSource)
  
    let subscriptionKey = ['CODE'];
    let endpoint = ['ENDPOINT']
    if (!subscriptionKey) { throw new Error('Set your environment variables for your subscription key and endpoint.'); }
    
    var uriBase = endpoint + "vision/v2.1/ocr";

    // Request parameters.
 

    // Display the image.
    var sourceImageUrl = imageSource;

    const data = new FormData();
    data.append(imageSource);

fetch(uriBase + "?" + {
        "language": "unk",
        "detectOrientation": "true",
    },
{
 
 method: 'POST',
 headers: 
 {
     'Content-Type': 'application/json',
     'Ocp-Apim-Subscription-Key': subscriptionKey,
 },
 body: '{"url": ' + '"' + data + '"}',


}).then((response) => response.json()).then((data) =>
{

  console.log(JSON.stringify(data, null, 2));

}).catch((error) =>
{
 console.log(error);

});
  };  
}

export default ImagePickerScreen;

Upvotes: 1

Views: 1054

Answers (1)

Stanley Gong
Stanley Gong

Reputation: 12153

Based on your code,there is something wrong with your data,it should an image URL so that Azure Version service can access it . I am not quite sure that how you get data in your custom logic . But anyway , this snippet below works , pls have a try :

const data = 'https://stanstroage.blob.core.windows.net/container2/personPic.jpg';

let subscriptionKey = '<key>';
let endpoint = '<endpoint>';
if (!subscriptionKey) { throw new Error('Set your environment variables for your subscription key and endpoint.'); }

var uriBase = endpoint + "vision/v2.1/ocr";

fetch(uriBase + "?" + {
    "language": "unk",
    "detectOrientation": "true",
},
{
method: 'POST',
headers: 
    {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscriptionKey,
    },
body: '{"url": ' + '"' + data + '"}',
}).then((response) => response.json()).then((data) =>
{
console.log(JSON.stringify(data, null, 2));
}).catch((error) =>
{
console.log(error);
});

Result: enter image description here

If you want to upload a local image, you should use application/octet-stream as request content-type and set image content buffer as request body. You can use react-native-fs to read your local image content and use buffer to get image content buffer and post it to Azure side , try snippet below below :

let subscriptionKey = '<key>';
let endpoint = '<endpoint>';
let fileUri = '<fileUri>';
let base64 =  await fs.readFile(fileUri, 'base64');
let data = Buffer.from(base64, 'base64');

console.log(data);

if (!subscriptionKey) { throw new Error('Set your environment variables for your subscription key and endpoint.'); }

var uriBase = endpoint + "vision/v2.1/ocr";

fetch(uriBase + "?" + {
    "language": "unk",
    "detectOrientation": "true",
},
{
method: 'POST',
headers: 
    {
    'Content-Type': 'application/octet-stream',
    'Ocp-Apim-Subscription-Key': subscriptionKey,
    },
body: data,
}).then((response) => response.json()).then((data) =>
{
console.log(JSON.stringify(data, null, 2));
}).catch((error) =>
{
console.log(error);
});

Result :

enter image description here

Upvotes: 1

Related Questions