В настоящее время я пытаюсь создать API с использованием обратной связи, которая позволяет мне отправить файл изображения размером 28x28 рукописного символа и обработать изображение с помощью сети тензорного потока и вернуть предсказание того, что сеть считает символом.
Однако для этого мне нужно иметь возможность отправлять изображение для обработки без необходимости сначала сохранять файл на сервере, и я не могу найти, как это сделать. Модули, такие как loopback-component-storage, великолепны, но я не хочу использовать один маршрут для отправки изображения, другой для обработки этого изображения, а затем третий для последующего удаления контейнера, содержащего этот файл изображения, что делает процесс требуется три разных запроса.
Следовательно, все сводится к следующему: есть ли способ прикрепить изображение к запросу, где поток может быть прочитан и интерпретирован API без необходимости сначала сохранять копию файла в другом месте на сервере?
заранее спасибо
Я хотел отправить файл изображения прямо в теле запроса. это для того, чтобы я мог передать его экземпляру класса Image, где я мог бы установить источник изображения в файл, включенный в запрос
Я рекомендую следующее решение:
Во-первых, настройте промежуточное ПО вашего сервера для парсинга тел запросов изображений:
Установите зависимость body-parser
.
$ npm install --save body-parser
Настройте парсер raw
, добавив следующее содержимое в раздел parse
вашего файла server/middleware.json
:
{
"body-parser#raw": {
"limit": "100kb",
"type": "image/*"
}
}
Опция «limit» устанавливает максимально допустимый размер тела запроса. Вы не хотите разрешать произвольный размер, чтобы злонамеренные клиенты не привели к сбою вашего сервера из-за ошибки «нехватки памяти».
Параметр «type» настраивает типы содержимого, которые должны анализироваться этим промежуточным программным обеспечением. В моем примере выше я разрешаю все типы изображений.
Затем реализуйте удаленный метод, принимающий тело запроса. Благодаря синтаксическому анализатору необработанного тела поток тела уже будет преобразован для вас в 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'},
});
};
Когда вы говорите о загрузке файла, имели ли вы в виду загрузить его, как если бы он был отправлен из HTML-формы (тип ввода = файл), то есть как одна из многих, возможно, составных записей, или вы можете отправить полезную нагрузку изображения непосредственно в тело запроса как единственные данные, отправленные на сервер?