Внутренняя ошибка сервера om Azure при записи файла из буфера в файловую систему - PullRequest
0 голосов
/ 09 октября 2019

Контекст

Я работаю над проверкой концепции для бухгалтерского бота. Частью решения является обработка квитанций. Пользователь делает изображение квитанции, бот задает некоторые вопросы об этом и сохраняет его в бухгалтерском решении.

Подход

Я использую пример узла BotFramework 15. Обработка вложенийкоторый загружает вложение в буфер массива и сохраняет его в локальной файловой системе. Готовы забрать и отправить в API бухгалтерского программного обеспечения.

async function handleReceipts(attachments) {
    const attachment = attachments[0];
    const url = attachment.contentUrl;
    const localFileName = path.join(__dirname, attachment.name);
    try {
     const response = await axios.get(url, { responseType: 'arraybuffer' });
        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;
            });
        }
         fs.writeFile(localFileName, response.data, (fsError) => {
            if (fsError) {
                throw fsError;
            }
        });
    } catch (error) {
        console.error(error);
        return undefined;
    }
    return (`success`);
}

При локальном запуске все работает как чудо (также благодаря mdrichardson - MSFT). При хранении в Azure я получаю

При отправке этого сообщения вашему боту произошла ошибка: код состояния HTTP InternalServerError

Я сузил проблему до второй частикод. Часть, которая пишет в локальную файловую систему (fs.writefile). Маленькие файлы и большие файлы приводят к одной и той же ошибке в швах Azure.fs.writefile, которые не могут найти файл

Что происходит в соответствии с журналами потоков:

Вложение, загруженное пользователем, сохраняется в Azure

{contentType: 'image / png', contentUrl: 'https://webchat.botframework.com/attachments//0000004/0/25753007.png?t=< очень длинная строка>', имя: 'fromClient :: 25753007.png'}

localFilename (место назначения вложения) разрешается в

localFileName: D: \ home \ site \ wwwroot \ dialogs \ fromClient :: 25753007.png

Axios загружает вложение вмассив буферов. Его ответ:

response.headers.content-type: image / png

Это интересно, потому что локально это 'application / octet-stream'

fs выдает ошибку:

fsError: Ошибка: ENOENT: нет такого файла или каталога, откройте 'D: \ home \ site \ wwwroot \ dialogs \ fromClient :: 25753007.png

Некоторая помощь очень ценится.

1 Ответ

0 голосов
/ 11 октября 2019

Удаление префикса :: fromClient из attachment.name решило эту проблему. Как @Sandeep упомянул в комментариях, специальные символы, где, вероятно, проблема. Не уверен, какова его цель. Упомянем об этом в репозитории github библиотеки образцов Botframework. [обновление] команда исправит это. Был вызван прямым обслуживанием.

...