2013-05-07 101 views
1

我在与inclomplete水滴正从Azure存储下载的问题。存储的文件是图像。几乎每个下载的文件都会在底部丢失几行。我检查了斑点并且他们正确地上传了。 我使用下面的代码从Azure的服务下载的blob:不完整Azure的下载

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和输出流的特性后,我注意到,即使斑给人下载后正确的长度,流通常说的东西稍低。我尝试下载throught范围,但无济于事

+0

哪里上传代码?这些图像如何进入Blob商店?这可能不是下载。你是如何检查斑点的? – SliverNinja 2013-05-07 13:07:37

+1

我已通过Azure存储资源管理器(http://azurestorageexplorer.codeplex.com/)检查了斑点。我将添加上传代码。 – 2013-05-07 13:15:17

+0

您确认使用外部工具下载它们的图像完好无损吗?此外,MD5哈希用于下载的内容。(我相信这是在默认情况下在2.0 SDK) – 2013-05-07 13:24:59

回答

0

好了,我已经成功地毕竟下载图像,通过部分使用WinRT的天青库用标准的.NET HttpClient的结合。

我使用Azure Lib建立初始连接,然后只获取Blob引用,因为BlockBlobReference有一个创建共享访问签名的方法(我真的不想尝试自己构造它)。然后我创建了HttpClient,使用SAS制作了一个下载URL,并向URL发出了一个GET请求,该请求最终正常工作并完整地下载了所有图像。

我觉得可能是在官方库一些奇怪的错误,因为使用的不是他们解决一切我的下载方法。

代码示例:

internal async Task Download(CloudBlobClient client) 
    { 

     try 
     { 
      _media = await _directory.CreateFileAsync(ResourceName, CreationCollisionOption.FailIfExists); 
     } 
     catch (Exception) 
     { 
      return; 
     } 
     try 
     { 
       var blob = await GetBlob(client); 
       HttpClient httpClient = new HttpClient(); 
       var date = DateTime.UtcNow; 
       var policy = new SharedAccessBlobPolicy(); 
       policy.Permissions = SharedAccessBlobPermissions.Read; 
       policy.SharedAccessStartTime = new DateTimeOffset(date); 
       policy.SharedAccessExpiryTime = new DateTimeOffset(date.AddDays(1)); 
       var signature = blob.GetSharedAccessSignature(policy); 
       var uriString = string.Format("{0}{1}", blob.Uri.ToString(), signature); 
       var data = await httpClient.GetByteArrayAsync(uriString); 
       var buf = new Windows.Storage.Streams.Buffer((uint)data.Length); 
       await FileIO.WriteBytesAsync(_media, data); 
       _category.NotifyAzureProgress(); 

     } 
     catch (Exception e) 
     { 
      _media.DeleteAsync(); 
      throw e; 
     } 
    }