将图像作为二进制数据上传到带有Node的认知服务

时间:2017-09-03 16:39:28

标签: node.js image microsoft-cognitive azure-cognitive-services

我正在尝试将Microsoft Cognitive服务面部API传递给用户上传的图像。该图像在uploads文件夹中的服务器上可用。

微软希望这张图片是&application; / octet-stream'并作为二进制数据传递。

我目前无法找到一种方法将图像传递给令人满意的API,以便接受并继续接收"解码错误,图像格式不受支持"。我意识到图像必须以blob或文件格式上传,但对NodeJ来说是新手,我真的不确定如何实现这一点。

到目前为止,我有这个并且看了几个选项,但没有一个有效,我尝试的其他选项返回了类似的错误,例如文件太小或太大'但是当我通过Postman手动测试相同的图像时它工作正常。

image.mv('./uploads/' + req.files.image.name , function(err) {
if (err)
  return res.status(500).send(err);
});

var encodedImage = new Buffer(req.files.image.data, 'binary').toString('hex');

let addAPersonFace = cognitive.addAPersonFace(personGroupId, personId, encodedImage);

addAPersonFace.then(function(data) {
  res.render('pages/persons/face', { data: data, personGroupId : req.params.persongroupid, personId : req.params.personid} );
})

2 个答案:

答案 0 :(得分:1)

您正在使用的软件包cognitive-services似乎不支持文件上传。您可以选择在GitHub page上提出问题。

如果这是一个选项,确实存在替代NPM包。使用project-oxford,您可以执行以下操作:

var oxford = require('project-oxford'),
    client = new oxford.Client(YOUR_FACE_API_KEY),
    uuid = require('uuid');

var personGroupId = uuid.v4();
var personGroupName = 'my-person-group-name';
var personName = 'my-person-name';
var facePath = './images/face.jpg';

// Skip the person-group creation if you already have one
console.log(JSON.stringify({personGroupId: personGroupId}));
client.face.personGroup.create(personGroupId, personGroupName, '')
  .then(function(createPersonGroupResponse) {
    // Skip the person creation if you already have one
    client.face.person.create(personGroupId, personName)
      .then(function(createPersonResponse) {
        console.log(JSON.stringify(createPersonResponse))
        personId = createPersonResponse.personId;
        // Associate an image to the person
        client.face.person.addFace(personGroupId, personId, {path: facePath})
          .then(function (addFaceResponse) {
            console.log(JSON.stringify(addFaceResponse));
          })
      })
  });

答案 1 :(得分:1)

请更新到版本0.2.0,现在应该可以使用。