2012-06-05 12 views
12

मैं स्ट्रीम के माध्यम से क्लाउडब्लोब से एक फ़ाइल डाउनलोड करने का प्रयास कर रहा हूं। मैं इस लेख CloudBlobक्लाउडब्लोब। डाउनलोड टॉस्ट्रीम रिटर्न शून्य

यहाँ का उल्लेख ब्लॉब

public Stream DownloadBlobAsStream(CloudStorageAccount account, string blobUri) 
{ 
    Stream mem = new MemoryStream(); 
    CloudBlobClient blobclient = account.CreateCloudBlobClient(); 
    CloudBlockBlob blob = blobclient.GetBlockBlobReference(blobUri); 

    if (blob != null) 
     blob.DownloadToStream(mem); 

    return mem; 
} 

और कोड यह बाइट सरणी

public static byte[] ReadFully(Stream input) 
    { 
     byte[] buffer = new byte[16 * 1024]; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
      return ms.ToArray(); 
     } 
    } 

लेकिन मैं हमेशा शून्य मान पाने में परिवर्तित करने के डाउनलोड करने के लिए कोड है। नीचे स्ट्रीम की गई फाइल की सामग्री है।

enter image description here

इसमें क्या गलत है? कृपया मदद करे।

संपादित

ReadFully विधि के अंदर 0 को स्थिति की स्थापना की अनुमति नहीं है, इसलिए मैं इसके अंदर DownloadBlobAsStream

डाल अब यह काम करना चाहिए:

public Stream DownloadBlobAsStream(CloudStorageAccount account, string blobUri) 
{ 
    Stream mem = new MemoryStream(); 
    CloudBlobClient blobclient = account.CreateCloudBlobClient(); 
    CloudBlockBlob blob = blobclient.GetBlockBlobReference(blobUri); 

    if (blob != null) 
     blob.DownloadToStream(mem); 
    mem.Position = 0; 
    return mem; 
} 
+0

आपकी ओर से कुछ गलतफहमी नहीं है के रूप में क्या आप वाकई 0 को स्थिति सेट कर सकते हैं @ ReadFully लेकिन आप उपयोग करना "इनपुट" वस्तु की जरूरत है। ऑब्जेक्ट मेम में DownloadBlobAsStream() के अंदर स्थानीय दायरा है, इसलिए यदि आप mem.Position को सेट करना चाहते हैं तो यह इस फ़ंक्शन में किया जाना चाहिए, हालांकि जब आप ReadFully() को कॉल करते हैं और अपनी "स्ट्रीम" ऑब्जेक्ट पास करते हैं, तो आप इसकी स्थिति 0 पर सेट कर सकते हैं ठीक है, जैसा कि मैंने अपनी पोस्टिंग में दिखाया है। तो दोनों स्वीकार किए जाते हैं और काम करेंगे। – AvkashChauhan

+0

यदि मैंने रीडफुलली के अंदर स्थिति = 0 सेट किया है, तो यह एक त्रुटि "समर्थित नहीं है" फेंकता है, और जब मैं इनपुट प्रॉपर्टी को देखने की कोशिश करता हूं, 'CanSeek = false' लेकिन आपके विचार ने बहुत मदद की। :) – fiberOptics

+0

बस स्पष्ट करने के लिए क्या आप एक शून्य मान या खाली बाइट सरणी प्राप्त कर रहे हैं? मैंने शून्य मूल्य नहीं देखा है, लेकिन स्ट्रीम स्थिति को बदलने के बिना किसी भी तरीके से मेरे परीक्षण में एक खाली बाइट सरणी देखी है। – kendaleiv

उत्तर

12

आपकी समस्या यह है कि अपने इनपुट स्ट्रीम पॉइंटर भाप के अंत में सेट है (स्क्रीन शॉट, लंबाई और स्थिति दोनों देखें समान मूल्य दिखाता है) यही कारण है कि जब आप इसे पढ़ते हैं तो आप हमेशा शून्य हो जाते हैं। आप Stream.Position = 0 नीचे के रूप में उपयोग करते हुए 0 के लिए इनपुट स्ट्रीम सूचक करने के लिए सेट करने की आवश्यकता होगी:

public static byte[] ReadFully(Stream input) 
{ 
    byte[] buffer = new byte[16 * 1024]; 

    input.Position = 0; // Add this line to set the input stream position to 0 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 
+2

तो क्या इसका मतलब यह है कि DownloadToStream वास्तव में इसके वादे तक नहीं जीता है? यह उपयोगकर्ता को अजीब से डेटा को वास्तव में स्ट्रीम करने की इजाजत देने की बजाय, डाउनलोडबेटएरे के रूप में लगभग वही काम कर रहा है क्योंकि यह आपको पूरी फाइल को स्मृति में पढ़ने के लिए मजबूर कर रहा है? –

+3

मुझे लगता है क्लाउडब्लॉकब्लॉब।OpenRead() का उपयोग स्ट्रीम प्राप्त करने के लिए किया जा सकता है जिसका उपयोग ब्लॉब के कुछ हिस्सों को पहले पूरी तरह से डाउनलोड किए बिना किया जा सकता है। – user764754

5

कैसे CloudBlob वस्तु पर OpenRead() विधि का उपयोग कर के बारे में?

public static string ReadFully(string blobUri, string itemUri) 
{ 
    // e.g. itemUri == "foo.txt" 
    // if there is a folder "bar" with foo.txt, provide instead: "bar/foo.txt" 
    CloudBlobContainer cloudBlobContainer = new CloudBlobContainer(new Uri(blobUri)); 
    CloudBlob blobReference = cloudBlobContainer.GetBlobReference(itemUri); 

    using (var stream = blobReference.OpenRead()) 
    { 
     using (StreamReader reader = new StreamReader(stream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
} 
0

मैं ऊपर कोड को लागू करने की कोशिश की है, लेकिन मेरे आश्चर्य करने, समारोह GetBlockBlobReferenceCloudBlobClient में लेकिन CloudBlockBlob में मौजूद नहीं थे।

शायद डीएलएल समय के माध्यम से बदल गया।

इसलिए मैं अपने अनुकूलन के साथ आप मौजूद:

public class BlobStorageHelper 
{ 
    private readonly CloudBlobClient _blobClient; 
    protected readonly CloudStorageAccount StorageAccount; 
    public string _containerName { get; set; } 

    public BlobStorageHelper() 

    { 
     _blobClient = base.StorageAccount.CreateCloudBlobClient(); 
     _containerName = ConfigurationManager.AppSettings["StorageContainerName"]; 
     StorageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); 
    } 

    protected Stream DownloadBlobAsStream(string blobUri) 
    { 
     CloudStorageAccount account = this.StorageAccount; 
     CloudBlockBlob blob = GetBlockBlobReference(account, blobUri); 

     Stream mem = new MemoryStream(); 
     if (blob != null) 
     { 
      blob.DownloadToStream(mem);     
     } 

     return mem; 
    } 

    private CloudBlockBlob GetBlockBlobReference(CloudStorageAccount account, string blobUri) 
    { 
     string blobName = blobUri.Substring(blobUri.IndexOf("/" + _containerName + "/")).Replace("/" + _containerName + "/", ""); 
     CloudBlobClient blobclient = account.CreateCloudBlobClient(); 
     CloudBlobContainer container = _blobClient.GetContainerReference(_containerName); 
     container.CreateIfNotExists(); 
     CloudBlockBlob blob = container.GetBlockBlobReference(blobName); 
     return blob; 
    } 


    public byte[] DownloadBlobAsByeArray(string blobUri) 
    { 
     Stream inputStream = DownloadBlobAsStream(blobUri); 

     byte[] buffer = new byte[16 * 1024]; 

     inputStream.Position = 0; // Add this line to set the input stream position to 0 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
      return ms.ToArray(); 
     } 
    } 


} 
संबंधित मुद्दे