Отправка массива файлов, загруженных с локального компьютера, в виде необработанных данных на мой сервер - PullRequest
0 голосов
/ 30 апреля 2019

у меня есть массив файлов, которые я хочу отправить в виде запроса (используя запрос) на мой сервер

var fs = require("fs");
var request = require("request");

var img = [];
img.push(fs.readFileSync("./test_images/0000.png", "binary"));
img.push(fs.readFileSync("./test_images/0001.png", "binary"));
img.push(fs.readFileSync("./test_images/0002.png", "binary"));
img.push(fs.readFileSync("./test_images/0003.png", "binary"));

function analyze_raw(images)
{
return new Promise((resolve, reject) =>
    {
    var options = 
        {
        url: "http://localhost:3000/api/face",
        method: "GET",
        //headers: //not working
        //  {
        //  Content-Type: "application/octet-stream"
        //  },
        body: images
        };

    request(options, function(err, response)
        {
        if(err)
            {
            return resolve(err);
            }
        else
            {
            return resolve(response.body);
            }
        });

    });
}
analyze_raw(img);

мой сервер должен принять файлы и отправить различные запросы в службы Microsoft vision, собрать их вместеи отправить результат обратно.Версия, которая отправляет изображения в виде веб-URL, работает, но я должен заставить ее работать и с необработанными файлами, и я понятия не имею, неправильно ли я отправляю файлы на мой сервер или просто отправляет файлыне то, что ожидает API api.

Каждый запрос к видению Microsoft должен иметь тип "application / octet-stream".Каждый запрос к моему серверу должен содержать список необработанных изображений, а затем он выполняет отдельные запросы.

Проблема в том, что я не знаю, где здесь моя ошибка, и как ее правильно сделать.


Вот код моего сервера, который вызывает службы Microsoft для отдельных изображений (который работает для URL, когда аргумент json верен)

function microsoft_request(req_url, req_content, method, req_key, json = true)
{
return new Promise((resolve, reject) =>
    {
    var microsoft_request_options = 
        {
        "url": keys.base_url + req_url,
        "method": method,
        "body": req_content,
        "headers": 
            {
            "Ocp-Apim-Subscription-Key": req_key
            }
        };

    if(json) { microsoft_request_options.json = true; }
    else { microsoft_request_options.headers["Content-Type"] = "application/octet-stream"; }

    //send request
    request(microsoft_request_options, function(err, response)
        {
        if(err)
            {
            return reject({error: {statusCode: 500, message: err}});
            }
        else if(response.statusCode != 200)
            {
            return reject({error: {statusCode: response.statusCode, message: response.body}});
            }
        else
            {
            return resolve({content: response.body});
            }
        });
    });
}

Здесь - это документация по API, который я пытаюсь использовать.Ошибка, которую я получаю от Microsoft vision при вызове моей собственной службы со списком необработанных файлов, является следующей (идентичной для каждого изображения):

{
"error":
    {
    "code": "InvalidImage",
    "message": "Decoding error, image format unsupported."
    }
}

Изображения являются jpg или png, оба поддерживаются в соответствии с документацией,Это заставляет меня верить, что происходит что-то странное, а несуществующая строгая или статическая типизация javascript сводит меня с ума.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Я на самом деле только что имел дело с чем-то похожим. Похоже, что запрос не очень хорошо документирует, но, скорее всего, лучшее решение - взять файлы и загрузить их с помощью multipart.

То, что вы делали, пытались взять двоичные данные и получить с телом. Это просто не сработает. Вы хотите

  • Использовать POST или PUT
  • Отправить с помощью multipart/form-data

    var fs = require("fs");
    var request = require("request");
    var img = [];
    img.push(fs.createReadStream("./test_images/0000.png"));
    img.push(fs.createReadStream("./test_images/0001.png"));
    img.push(fs.createReadStream("./test_images/0002.png"));
    img.push(fs.createReadStream("./test_images/0003.png"));
    
    function analyze_raw(images) {
        return new Promise((resolve, reject) => {
            var options = {
                url: "http://localhost:3000/api/face",
                method: "POST", // or PUT
                formData: {
                    images // ES6 shorthand
                }
            };
            request(options, function(err, response) {
                if(err) {
                    return resolve(err);
                } else {
                    return resolve(response.body);
                }
            });
        });
    }
    

На вашем сервере вы бы хотели обрабатывать многоэтапную загрузку с помощью библиотеки типа multer или грозной.

0 голосов
/ 30 апреля 2019

В указанной вами документации написано:

Поддерживаемые форматы изображений: JPEG, PNG, GIF, BMP. Размер файла изображения должен быть менее 4 МБ. Размеры изображения должны быть не менее 50 x 50.

То, как вы отправляете их, заключается в том, что все тело должно быть двоичным выводом, а затем указывать Content-Type, например, PNG (multipart / form-data или application / octet-stream).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...