为了账号安全,请及时绑定邮箱和手机立即绑定

将附件保存在Blob容器中-Bot Framework

将附件保存在Blob容器中-Bot Framework

C#
智慧大石 2021-04-08 14:09:16
我正在使用Azure存储记录我的机器人与用户之间的对话。我想将用户发送的附件存储在Azure Blob容器中。我以这种方式使用ContentUrl属性:foreach (Attachment item in message.Attachments)        {            /// creo una sottodirectory in cui verranno salvate tutte le immagini con quel conversation Id, quindi di quella conversazione            CloudBlockBlob targetBlob = _alturasbotChatAttachmentBlobsContainer.GetBlockBlobReference("conv#" + message.Conversation.Id.ToLower() + "/" + item.Name);            /// carico il file dall'url datomi dall'utente            try            {                await targetBlob.StartCopyAsync(new Uri(item.ContentUrl));            }            catch (Exception e)            {                throw;            }        }问题是,如果网址不是绝对网址,则在try-catch内会引发异常(例如,如果我从Google插入图片网址而不是contentUrl,则一切正常。)也许ContentUrl无法以这种方式使用,因为它是本地地址。有办法解决问题吗?我是否必须使用Content属性(如果是,如何使用?)。谢谢
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

部分回答您的问题(因为我还没有使用Bot框架)。

本质上,复制Blob操作要求源项目的URL应该是可公开访问的,因为复制操作是异步服务器端操作,并且一旦提交了复制Blob请求,Azure Storage应该能够从源中读取。这就是为什么当您从Google获取URL并使用该URL代替附件的ContentUrl时,您的代码才能工作的原因。

由于我还没有使用Bot框架(因此我将纯粹是在推测),您可以做的一件事是读取要尝试以流形式保存在代码中的附件的内容(不确定如何做到)和然后使用CloudBlockBlob.UploadFromStream方法上传Blob。


查看完整回答
反对 回复 2021-04-17
?
慕森王

TA贡献1777条经验 获得超3个赞

最后,我发现附件的内容为空,因此我必须使用HttpClient下载内容,然后将文件上传到Azure Blob容器。现在可以了。对于最好奇的:


using (HttpClient client = new HttpClient())

                {

                    using (HttpResponseMessage response = await client.GetAsync(item.ContentUrl))

                    using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())

                    {

                        await targetBlob.UploadFromStreamAsync(streamToReadFrom);

                    }

                }


查看完整回答
反对 回复 2021-04-17
  • 3 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信