Контекст
Я работаю над проверкой концепции для бухгалтерского бота. Частью решения является обработка квитанций. Пользователь делает изображение квитанции, бот задает некоторые вопросы об этом и сохраняет его в бухгалтерском решении.
Подход
Я использую пример узла 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
Некоторая помощь очень ценится.