Как разместить изображение в виде файла с Axios после получения его в виде массива из вложения - PullRequest
0 голосов
/ 03 октября 2019

Как POC я хотел бы сделать фотографии своих квитанций (бензин, магазин и т. Д.) И использовать чат-бота для отправки их в мое бухгалтерское программное обеспечение. Моя проблема связана с отправкой собранной квитанции (изображения) в бухгалтерское программное обеспечение с использованием его API.

Первая часть (получение вложения) приводит к созданию массива с изображением. Для этого я использовал один из образцов NodeJS (номер 15).

    const attachment = turnContext.activity.attachments[0];
    const url = attachment.contentUrl;
    let image;
    axios.get(url, { responseType: 'arraybuffer' })
        .then((response) => {
            if (response.headers['content-type'] === 'application/json') {
                response.data = JSON.parse(response.data, (key, value) => {
                    return value && value.type === 'Buffer' ? Buffer.from(value.data) : value;
                });
            }
            image = response.data;
        }
        ).catch((error) => {
            console.log(error);
        });

Я борюсь со второй частью. Публикация изображения в бухгалтерской программе

const requestConfig = {
        headers: {
            'Authorization': 'Bearer ' + accessToken,
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    };
    axios.post(postUrl, image, requestConfig)
        .then((response) => { console.log(response); }
        ).catch((error) => {
            console.log(error);
        });
};

Это приводит к 400. неправильный запрос. Возможно, API нужен файл, и я не могу просто отправить буфер. Я проверил с помощью Postman, и запрос был принят с помощью application / x-www-form-urlencoded (с помощью локально сохраненного файла изображения).

Какова лучшая практика для публикации изображения, полученного в буферном массиве?

1 Ответ

1 голос
/ 03 октября 2019

Я думаю, что ваш комментарий прав на деньги, которые вам нужны, чтобы сначала преобразовать их в файл. Канал не проблема, потому что файл будет храниться везде, где размещен бот. Образец Attachments на самом деле имеет этот код , который приближает вас:

fs.writeFile(localFileName, response.data, (fsError) => {
    if (fsError) {
        throw fsError;
    }
    // Send the file
    const url = '<yourApiUrl>';
    const formData = new FormData();
    formData.append('file',fs.createReadStream('<pathToFile>'), { knownLength: fs.statSync('<pathToFile>').size });
    const config = {
        headers: {
            ...formData.getHeaders(),
            'Content-Length': formData.getLengthSync()
        }
    };
    axios.post(url, forData, { headers });
});

Я не очень уверен в разделе // Send the file только потому, что могуне проверяйте ваш API. Я получил большую часть кода от здесь .

...