上下文
我正在为会计机器人开发概念证明。解决方案的一部分是处理收据。用户对收据进行图片处理,机器人会询问一些问题并将其存储在会计解决方案中。
方法
我正在使用BotFramework nodejs示例15.处理附件,该附件将附件加载到arraybuffer中并将其存储在本地文件系统中。准备好拿起并发送到会计软件的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
真的很感谢一些帮助。
答案 0 :(得分:0)
从附件.name中删除:: fromClient前缀即可解决。正如@Sandeep在评论中提到的那样,特殊字符可能在哪里出现问题。不知道它的目的是什么。将在Botframework示例库github存储库中提及。 [更新]小组将解决此问题。是由直线服务引起的。