2013-08-07 4 views
6

Ich habe den folgenden Code:Warum gibt CloudBlockBlob.DownloadToStream immer einen leeren Stream zurück?

public static void UploadStreamToBlob(Stream stream, string containerName, string blobName) 
{ 
    CloudStorageAccount storageAccount = 
     CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

    CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName); 
    blobContainer.CreateIfNotExists(); 
    blobContainer.SetPermissions(
     new BlobContainerPermissions 
     { 
      PublicAccess = BlobContainerPublicAccessType.Blob 
     }); 

    CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(blobName); 
    long streamlen = stream.Length; <-- This shows 203 bytes 
    blockBlob.UploadFromStream(stream);   
} 

und

public static Stream DownloadStreamFromBlob(string containerName, string blobName) 
{ 
    CloudStorageAccount storageAccount = 
     CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

    CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName); 

    Stream stream = new MemoryStream(); 
    CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(blobName); 

    if (blockBlob.Exists()) 
    { 
     blockBlob.DownloadToStream(stream); 
     long streamlen = stream.Length; <-- This shows 0 bytes 
     stream.Position = 0;   
    } 

    return stream; 
} 

ich dies in dem Azure-Emulator ausgeführt wird, das ich meinen SQL Server hingewiesen habe.

Von dem, was ich sagen kann, scheint es, dass der UploadFromStream die Daten korrekt sendet, aber wenn ich versuche, den DownloadStreamFromBlob auszuführen, gibt es einen 0-Länge-Stream zurück. Die blockBlob.Exists gibt true zurück, also nehme ich an, dass es da ist. Ich kann einfach nicht herausfinden, warum mein Stream leer ist.

Btw, ich bin in Test übergeben und für Containername und BlobName auf beide Aufrufe testen.

Irgendwelche Ideen?

Antwort

10

Ah, ich es herausgefunden ...

die folgenden Zeilen: nur half mir aus einem leeren Blob:

long streamlen = stream.Length; 
blockBlob.UploadFromStream(stream); 

Notwendigkeit

long streamlen = stream.Length; 
stream.Position = 0; 
blockBlob.UploadFromStream(stream); 
+1

+1 geändert werden Download-Szenario ... So oft sind es die einfachen Details, die uns stolpern. –

+1

Es ist ein häufiges Problem beim Arbeiten mit Streams. Ich setze auf meine IO-Methoden 'stream.Seek (0, SeekOrigin.Begin);' –

Verwandte Themen