将图像发送到节点服务器并调用OCR microsoft vision API

我试图从Android设备发送一个图像(通过手机摄像头捕获)到一个nodeJS服务器,然后从那里调用微软OCR。 我的技术是,图像被压缩,得到字节数组,并使用HTTP POST方法发送到节点服务器,从节点服务器,从请求中获取字节数组并调用API。

这里是使用的过程:1)。 获取位图图像

2)。 创buildHTTP请求如下:

HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Cache-Control", "no-cache"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"title\""+ lineEnd); dos.writeBytes(lineEnd); ByteArrayOutputStream output = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 50, output); byte[] bufAry = output.toByteArray(); dos.write( bufAry, 0, bufAry.length); dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); dos.flush(); 

从节点这边是这个代码:

 router.post('/', rawBody, function(req, res, next) { console.log("post request"); if (req.rawBody && req.bodyLength > 0) { sendRequestForOCR(req.rawBody, res ); } else { res.send(500); } }); function rawBody(req, res, next) { var chunks = []; req.on('data', function(chunk) { chunks.push(chunk); }); req.on('end', function() { var buffer = Buffer.concat(chunks); req.bodyLength = buffer.length; req.rawBody = buffer; next(); }); req.on('error', function(err) { console.log(err); res.status(500); }); } function sendRequestForOCR( image, res ) { var encodedImg = querystring.stringify({ data: image }); var options = { host: 'api.projectoxford.ai', path: '/vision/v1.0/ocr', port: '80', method: 'POST', headers: { 'Content-Type' : 'application/octet-stream', 'Ocp-Apim-Subscription-Key': 'my_key' } }; var httpreq = http.request(options, function (response) { response.setEncoding('utf8'); response.on('data', function (chunk) { console.log("body: " + chunk); }); response.on('end', function() { res.send('ok'); }) }); httpreq.write(encodedImg); httpreq.end(); } 

但是当执行时,我得到的消息是:

 "code":"InvalidImageFormat", "message":"Input data is not a valid image." 

任何人都可以让我知道代码中的问题是什么? 它是压缩图像或问题的stream媒体?

谢谢。

由于您一次只能处理一个图像,因此您应该修改Java代码,以简单地发送RAW字节,而不使用多部分MIME。 在编写代码时,nodejs服务器接收到的有效内容包含多部分MIME所需的附加装饰(边界,名称等)。 所以:

 HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Cache-Control", "no-cache"); conn.setRequestProperty("Content-Type", "application/octet-stream"); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); ByteArrayOutputStream output = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 50, output); byte[] bufAry = output.toByteArray(); dos.write(bufAry, 0, bufAry.length); dos.flush(); 

这个Java代码可以直接调用Microsoft Cognitive Services URL。 但是,如果您需要您的中间nodejs服务器进行其他处理,则您将需要传递二进制有效内容而不进行修改。 换一种说法,

 function sendRequestForOCR( image, res ) { var options = { host: 'api.projectoxford.ai', path: '/vision/v1.0/ocr' method: 'POST', headers: { 'Content-Type' : 'application/octet-stream', 'Ocp-Apim-Subscription-Key': 'my_key' } }; var httpreq = https.request(options, function (response) { response.on('data', function (chunk) { console.log("body: " + chunk); }); response.on('end', function() { res.send('ok'); }) }); httpreq.write(image); httpreq.end();