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; 
     } 
    }