2013-05-07 6 views
1

Azure 저장 장치에서 다운로드되는 완전 얼룩에 문제가 있습니다. 저장되는 파일은 이미지입니다. 다운로드되는 거의 모든 파일은 맨 아래에 여러 행이 누락됩니다. 나는 얼룩을 검사했고 올바르게 업로드되었습니다. 나는 푸른 서비스에서 방울을 다운로드 다음 코드를 사용하고 :불완전한 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 및 출력 스트림의 속성을 검사 한 후, 다운로드 한 후 BLOB가 올바른 길이를 제공하더라도 스트림이 일반적으로 조금 더 낮게 표시된다는 것을 알았습니다. 내가 범위를 다운로드했지만 아무 소용이 시도

+0

업로드 코드입니까? 이 이미지들은 Blob 저장소에 어떻게 들어가고 있습니까? 그것은 다운로드가 아닌 것이 가능합니다. 얼룩을 어떻게 확인 했니? – SliverNinja

+1

Azure Storage Explorer (http://azurestorageexplorer.codeplex.com/)를 통해 얼룩을 확인했습니다. 업로드 코드를 추가하겠습니다. –

+0

이미지를 다운로드하기 위해 외부 도구를 사용하여 이미지가 손상되지 않았 음을 확인 했습니까? 또한 MD5 해시는 다운로드 한 콘텐츠에 사용됩니다 (2.0 SDK에서 기본적으로 켜져 있다고 생각합니다). –

답변

0

좋아, 그래서 난 부분적으로 표준 .NET HttpClient와 결합 된 WinRT Azure 라이브러리를 사용하여 이미지 afterall를 다운로드 관리했습니다.

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; 
     } 
    } 
관련 문제