无法将图像发送到Azure API

时间:2019-12-03 20:40:03

标签: reactjs azure react-native ocr

我正在使用亚马逊制作OCR应用程序。我正在使用React Native做的应用程序。而且在发送数据时出现错误。

错误:

  

{     “ code”:“ InvalidImageUrl”,     “ requestId”:“ c495b0d7-a65a-4138-97a9-2b1cb25dced8”,     “ message”:“图像URL格式错误。”   }

为什么?我究竟做错了什么?代码:

// ...

  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;

1 个答案:

答案 0 :(得分:1)

根据您的代码,您的data出了点问题,它应该是图像URL,以便Azure版本服务可以访问它。我不太确定您如何在自定义逻辑中获得data。但是无论如何,下面的代码片段可以用,请尝试一下:

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);
});

结果: enter image description here

如果要上传本地图像,则应将application/octet-stream用作请求content-type,并将图像内容缓冲区设置为请求正文。 您可以使用react-native-fs来读取本地图像内容,并使用buffer来获取图像内容缓冲区并将其发布到Azure端,请尝试下面的代码段:

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);
});

结果:

enter image description here