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

我正在使用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属性(如果是,如何使用?)。谢谢


智慧大石
浏览 185回答 3
3回答

呼如林

部分回答您的问题(因为我还没有使用Bot框架)。本质上,复制Blob操作要求源项目的URL应该是可公开访问的,因为复制操作是异步服务器端操作,并且一旦提交了复制Blob请求,Azure Storage应该能够从源中读取。这就是为什么当您从Google获取URL并使用该URL代替附件的ContentUrl时,您的代码才能工作的原因。由于我还没有使用Bot框架(因此我将纯粹是在推测),您可以做的一件事是读取要尝试以流形式保存在代码中的附件的内容(不确定如何做到)和然后使用CloudBlockBlob.UploadFromStream方法上传Blob。

慕森王

最后,我发现附件的内容为空,因此我必须使用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);                    }                }
打开App,查看更多内容
随时随地看视频慕课网APP