【问题标题】:Save attachment in blob container - bot framework在 blob 容器中保存附件 - 机器人框架
【发布时间】:2018-09-22 11:02:35
【问题描述】:

我正在使用 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 插入图像 url 而不是 contentUrl,则一切正常)。也许 ContentUrl 不能以这种方式使用,因为它是本地地址。有没有办法解决问题?我是否必须使用 Content 属性(如果是,如何使用?)。 谢谢

【问题讨论】:

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


    【解决方案1】:

    如果你阅读 API 参考,它直接说 CloudBlockBlob 使用 absolute URI 对 blob 执行所有操作。

    您可以在 CloudBlob.StorageUri 属性中找到 URI

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案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);
                            }
                        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-04
          • 2019-10-12
          • 2018-04-25
          • 2016-04-26
          • 2018-09-04
          • 1970-01-01
          • 2021-06-23
          相关资源
          最近更新 更多