在blob容器中保存附件 - bot框架

时间:2018-04-12 10:22:09

标签: c# azure azure-storage botframework azure-blob-storage

我正在使用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;
            }
        }

问题是,如果url不是绝对的,那么在try-catch内部会抛出异常(例如,如果我从google而不是contentUrl插入图像url,则一切正常)。也许ContentUrl不能以这种方式使用,因为它是本地地址。有办法解决这个问题吗?我是否必须使用Content属性(如果是,如何?)。 感谢

3 个答案:

答案 0 :(得分:2)

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

基本上复制blob操作要求源项目的URL应该是公共可访问的,因为复制操作是异步服务器端操作,并且一旦提交了复制blob请求,Azure存储应该能够从源读取。这就是为什么当您从谷歌获取URL并使用该代码而不是附件的ContentUrl时,您的代码有效的原因。

由于我没有使用Bot框架(因此我将纯粹推测),您可以做的一件事是阅读您尝试以流形式保存在代码中的附件内容(不知道您是怎么做的)会这样做)然后使用CloudBlockBlob.UploadFromStream方法上传blob。

答案 1 :(得分:1)

感谢谁的回复。 最后,我发现附件的内容为空,因此我使用HttpClient下载内容,然后我将文件上传到Azure Blob Container。现在它有效。对于最好奇的人:

using (HttpClient client = new HttpClient())
                {
                    using (HttpResponseMessage response = await client.GetAsync(item.ContentUrl))
                    using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
                    {
                        await targetBlob.UploadFromStreamAsync(streamToReadFrom);
                    }
                }

答案 2 :(得分:0)

如果您阅读API参考,则直接说明CloudBlockBlob 使用绝对URI 对blob执行所有操作。

您可以在CloudBlob.StorageUri Property

中找到URI

https://docs.microsoft.com/en-gb/dotnet/api/microsoft.windowsazure.storage.blob.cloudblockblob?view=azure-dotnet