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