【发布时间】:2013-05-07 11:57:00
【问题描述】:
我在从 Azure 存储下载不完整的 blob 时遇到问题。存储的文件是图像。几乎每个下载的文件最终都会在底部丢失几行。我检查了 blob,它们已正确上传。 我正在使用以下代码从 Azure 服务下载 blob:
private async Task Download(CloudBlobClient client)
{
try
{
_media = await _directory.CreateFileAsync(ResourceName, CreationCollisionOption.FailIfExists);
}
catch (Exception)
{
return;
}
using (var stream = await _media.OpenAsync(FileAccessMode.ReadWrite))
{
var blob = await GetBlob(client);
await blob.DownloadToStreamAsync(stream);
_category.NotifyAzureProgress();
await stream.FlushAsync();
}
}
GetBlob() 方法如下所示:
private async Task<CloudBlockBlob> GetBlob(CloudBlobClient client)
{
CloudBlobContainer container = client.GetContainerReference(ContainerName);
await container.CreateIfNotExistsAsync();
var blob = container.GetBlockBlobReference(ResourceName);
return blob;
}
上传代码:
private async Task UploadAsync(CloudBlobClient client)
{
_media = await _directory.GetFileAsync(ResourceName);
using (var stream = await _media.OpenAsync(FileAccessMode.Read))
{
var blob = await GetBlob(client);
await blob.UploadFromStreamAsync(stream);
_category.NotifyAzureProgress();
}
}
感谢您的帮助!
编辑:我意识到我错过了一个细节 - 下载的图像尺寸正确,但底部的几行是黑色的 - 它与源图像的像素不同。我检查了 MD5 哈希值,当它们匹配时,当我通过外部应用程序下载图像时,当我使用上面的代码下载它们时它们不匹配。
Edit2:在检查了 CloudBlob 的属性和输出流之后,我注意到,即使 blob 在下载后给出了正确的长度,流通常会显示一些较低的内容。我已经尝试通过范围下载,但无济于事
【问题讨论】:
-
上传代码在哪里?这些图像是如何进入 Blob 商店的?可能不是下载。你是如何检查斑点的?
-
我已通过 Azure 存储资源管理器 (azurestorageexplorer.codeplex.com) 检查了 blob。我将添加上传代码。
-
您确认使用外部工具下载图像完好无损?此外,MD5 哈希用于下载的内容。(我相信它在 2.0 SDK 中默认开启)
-
是的,正如我在上面所写的,我已经通过 Azure 存储资源管理器应用程序检查了这些图像。当我尝试下载这些图像时,它们总是会出现不同的结果 - 有时它们是完整的,有时底部会丢失一大块可变大小。
-
如果您尝试使用等效的同步方法,您还有问题吗?旁注:您不应该在每次上传时都调用
container.CreateIfNotExistsAsync()- 这是一种浪费的网络交易。创建一次容器,如果可以帮助它,请不要再次调用它。
标签: c# .net azure windows-runtime azure-mobile-services