Как я могу отправить поток, содержащий файл изображения, удаленному методу в режиме loopback? - PullRequest
0 голосов
/ 26 октября 2018

В настоящее время я пытаюсь создать API с использованием обратной петли, который позволяет мне отправлять файл изображения размером 28x28 рукописного символа, обрабатывать изображение в сети с тензорным потоком и возвращать прогноз того, что сеть думает о символе.

Однако, чтобы сделать это, мне нужно иметь возможность отправить изображение для обработки без необходимости сначала сохранять файл на сервере, и я не могу найти, как это сделать.Модули, такие как loopback-component-storage, хороши, но я не хочу использовать один маршрут для отправки изображения, другой для обработки этого изображения, а затем третий для удаления контейнера, содержащего этот файл изображения, что делает процесстребуется три разных запроса.

Следовательно, все сводится к этому, есть ли способ, которым я могу прикрепить изображение к запросу, где поток может быть прочитан и интерпретирован API без необходимости сначала сохранять копиюфайл где-нибудь еще на сервере?

Заранее спасибо

1 Ответ

0 голосов
/ 11 декабря 2018

Я рекомендую следующее решение:

Сначала настройте промежуточное ПО вашего сервера на тела запросов изображений анализатора:

  1. Установка body-parser зависимости.

    $ npm install --save body-parser
    
  2. Настройте синтаксический анализатор raw, добавив в раздел parse вашего файла server/middleware.json следующее содержимое:

    {
      "body-parser#raw": {
        "limit": "100kb",
        "type": "image/*"
      }
    }
    

    Опция «limit» устанавливает максимально допустимый размер тела запроса.Вы не хотите разрешать произвольный размер, чтобы предотвратить сбой вашего сервера злоумышленниками из-за ошибки «недостаточно памяти».

    Параметр «тип» настраивает типы содержимого, которые должны анализироваться этим промежуточным ПО.В приведенном выше примере я разрешаю все типы изображений.

Далее реализуем удаленный метод, принимающий тело запроса.Благодаря необработанному парсеру тела поток тела будет уже преобразован в Buffer для вас.В моем примере ниже у меня есть простой метод, который отвечает телом в кодировке base64.

module.exports = function(Image) {
  Image.analyze = async function(data) {
    // Reject non-image requests, e.g. JSON
    if (!Buffer.isBuffer(data)) {
      const err = new Error('Unsupported media type'); 
      err.statusCode = 415;
      throw err;
    }

    // data is a Buffer containing the request body
    return data.toString('base64');
  };

  Image.remoteMethod('analyze', {
    accepts: [
      // {source: 'body'} is the important part
      {arg: 'data', type: 'object', http: {source: 'body'}},
    ],
    returns: {root: true, type: 'string'},
    http: {path: '/analyze', verb: 'post'},
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...