2011-05-13 20 views
5

मेरे पास एक एमवीसी वेब ऐप है जो एज़ूर में चल रहा है जो एमपी 3, पीडीएफ, इत्यादि जैसी बड़ी फाइलें प्रदान करता है ... जो क्लाउड स्टोरेज में संग्रहीत हैं। उन फ़ाइलों को सेवा देने का सबसे अच्छा तरीका क्या है, इसलिए लिंक/बटन पर क्लिक करते समय उपयोगकर्ता उन्हें डाउनलोड कर सकते हैं?एज़ूर क्लाउड स्टोरेज से बड़ी फ़ाइलों को डाउनलोड करने का सबसे अच्छा तरीका

आसान तरीका उन लोगों के साथ दिखाने के लिए सिर्फ यह है:

<a href="...blob.core.windows.net/container/file.mp3">

लेकिन तब उपयोगकर्ता डाउनलोड करने के लिए राइट क्लिक करना पड़ता है।

एक डाउनलोड के लिए मजबूर करने के लिए, आप एक फ़ाइल ActionResult लौट सकते हैं:

public ActionResult GetPDF(string filename) 
{ 
    return File(filename, "application/pdf", Server.HtmlEncode(filename)); 
} 

इस के साथ दोष यह है (मुझे लगता है कि) webrole फ़ाइलों और स्ट्रीम करने के लिए उन्हें उत्पादन में पढ़ने के लिए है, जो होगा है संसाधनों का उपभोग करें, और संभावित रूप से बहुत से उपयोगकर्ताओं के साथ भूमिका निभाएं। जबकि सरल href लिंक समाधान मूल रूप से काम को बंद कर देता है ताकि ब्राउजर सीधे क्लाउड स्टोरेज से बात कर सके।

क्या मैं सही हूँ? क्या मुझे वेब्रोल पर अतिरिक्त काम के बारे में चिंतित होना चाहिए?

क्या वेबोलर बोझ किए बिना फ़ाइल डाउनलोड को मजबूर करने का कोई और तरीका है?

अद्यतन:

तो क्या मैं के साथ सामग्री प्रकार एमपी 3 के अपलोड करने गया था कर समाप्त हो गया "बाइनरी/ओकटेट धारा" - यह एक डाउनलोड संकेत मजबूर करने के लिए लगता है। सुनिश्चित नहीं है कि यह एक अच्छा अभ्यास है, लेकिन यह अब तक काम करता है।

उत्तर

4

आपकी धारणा सही है, यदि आप ActionResult का उपयोग करना चाहते हैं तो आपको फ़ाइल को पहले वेब भूमिका में डाउनलोड करना होगा और फिर उसे क्लाइंट को स्ट्रीम करना होगा। यदि आप इसे विशेष रूप से बड़ी फाइलों से बचाना चाहते हैं और इसे एज़ूर स्टोरेज तक छोड़ दें क्योंकि तब माइक्रोसॉफ्ट को अनुरोध से निपटने के बारे में चिंता करने की ज़रूरत है, अगर आपको बहुत सारे ट्रैफिक मिलते हैं तो आपको अधिक वेब भूमिकाओं का भुगतान नहीं करना पड़ता है।

यह अच्छी तरह से काम करता है यदि आप जिन फ़ाइलों को होस्ट कर रहे हैं वे सार्वजनिक हैं, लेकिन यदि आप फ़ाइलों को सुरक्षित करना चाहते हैं तो थोड़ा सा ट्रिकियर प्राप्त होता है (यदि आप इसे करना चाहते हैं तो shared access signatures देखें)।

क्या आपने ब्लॉब पर सामग्री प्रकार सेट करने का प्रयास किया है? ब्लॉब स्टोरेज में फ़ाइलों को अपलोड करने के तरीके के आधार पर वे सेट नहीं हो सकते हैं। आप अपने खुद के कोड के माध्यम से धब्बे अपलोड कर रहे हैं आप के माध्यम से CloudBlob.Attributes.Properties.ContentType (MSDN से)

+0

धन्यवाद। हां, सामग्री प्रकार सही ढंग से सेट किया गया है (ऑडियो/एमपीईजी), और जब आप उस लिंक पर क्लिक करते हैं जो ब्राउज़र में चलता है। मैं उम्मीद कर रहा था कि Webrole के माध्यम से बिना डाउनलोड शुरू करने का कोई तरीका था। ऐसा लगता है कि यह जावास्क्रिप्ट के साथ करने योग्य होना चाहिए? आप बस ब्राउज़र को इसे खेलने के बजाए डाउनलोड करना चाहते हैं। – PeteShack

+0

मुझे ब्लॉब स्टोरेज से डाउनलोड करते समय पहेली का गुम टुकड़ा मिला है, इसमें सामग्री-स्वभाव हेडर अटैचमेंट पर सेट नहीं है, इसलिए ब्राउज़र को यह नहीं पता कि आप इसे डाउनलोड के रूप में देखना चाहते हैं और नहीं बस इसके साथ कुछ करें (मुझे लगता है कि आप इसे Azure के प्री-रिलीज़ संस्करणों में सेट कर सकते हैं)। ब्लॉब और कंटेंट-डिस्पोजिशन के लिए एक साधारण खोज आपको एमवीसी के बाहर ऐसा करने के तरीके पर बड़ी संख्या में उदाहरण देगी। मुझे संदेह है कि यह सभी फाइल एक्शन परिणाम कर रहा है। – knightpfhor

0

मैं एक ActionResult विकसित किया है था भंडारण से फ़ाइल प्राप्त इस का उपयोग कर सकते, लेकिन मैं स्ट्रीम पर उत्पादन के लिए arrice नहीं किया था और एक डाउनलोड की गई फ़ाइल लौटने के लिए, मैं यह मेरी कार्रवाई कोड कृपया एक सहायता प्राप्त कर सकते हैं: public ActionResult GetPDF (स्ट्रिंग फ़ाइल का नाम) {

var storageAccountName = this.User.StorageAccountName; 
     var storageAccountKey = this.User.StorageAccountKey; 
     string connectionString = string.Format(
        "DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", 
        storageAccountName, storageAccountKey); 

     //Extraction de votre chaîne de connexion par programme 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString); 

     //Create a CloudFileClient object for credentialed access to File storage. 
     CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); 

     //Get a reference to the file share . create a share folder take the name of CompanyCode 
     CloudFileShare share = fileClient.GetShareReference(this.User.CompanyCode); 

     share.CreateIfNotExists(); 
     byte[] fileBytes = null; 
     // create if not Exist 
     if (share.Exists()) 
     { 
      // string StoragePath = "/Uploads/Locations/" + LocationToAdd.Id.ToString(); 

      CloudFileDirectory rootDirectory = share.GetRootDirectoryReference(); 
      CloudFileDirectory topDirectory = rootDirectory.GetDirectoryReference("Uploads"); 
      topDirectory.CreateIfNotExistsAsync(); 
      CloudFileDirectory midDirectory = topDirectory.GetDirectoryReference("Locations"); 
      midDirectory.CreateIfNotExistsAsync(); 
      CloudFileDirectory sampleDir = midDirectory.GetDirectoryReference(document1.LocationId.ToString()); 
      sampleDir.CreateIfNotExistsAsync(); 
      //Get a reference to the file we created previously. 
      CloudFile file = sampleDir.GetFileReference(filename); 

      if (file.Exists()) 
      { 
       //Write the contents of the file to the console window. 
       // string fileresult = file.DownloadTextAsync().Result; 
       // file.DownloadToByteArray(fileBytes, 1, null, null, null); 

       string outputFileName = Path.GetTempFileName(); 
       if (System.IO.File.Exists(outputFileName)) 
       { 
        System.IO.File.Delete(outputFileName); 
       } 
       OperationContext context = new OperationContext(); 
       file.DownloadToFileAsync(outputFileName, FileMode.CreateNew, null, null, context); 

       // what should i do after this ........ 
      } 
      } 
      } 
} 
1

आप outputFileName जो पथ जहाँ फ़ाइल डाउनलोड कर रहा है को शामिल लौट सकते हैं और उस पथ प्रदर्शित कर सकते हैं संदेश के साथ सामने वाले स्थान पर फ़ाइल को डाउनलोड किया गया है [...]

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

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