दिलचस्प पोस्ट
Qt, GCD- शैली में किसी दिए गए धागे में एक मजेदार या लैम्ब्डा को कैसे निष्पादित करें? विकर्ण पर मूल्य कैसे निर्दिष्ट करें? मैं ओरेकल में एक अल्पविराम से सीमांकित सूची में कई पंक्तियों को कैसे जोड़ सकता हूं? PHP ई-मेल एन्कोडिंग? AngularJS: त्रुटि रोकें $ $ पहले से ही प्रगति पर है जब $ दायरे को कॉल करते हैं। $ लागू होते हैं () मैं Python में DNS lookups कैसे कर सकता हूं, जिसमें / etc / hosts का संदर्भ भी शामिल है? ऑब्जेक्ट प्रारंभकर्ता और कन्स्ट्रक्टर के बीच अंतर क्या है? जावास्क्रिप्ट में महीने के आखिरी दिन की गणना करें पैरेंट ईवेंट हैंडलर के निष्पादन को रोकें Mod_rewrite वाले केस असंवेदनशील यूआरएल एंड्रॉइड वाईफ़ाई विशिष्ट वाईफ़ाई कनेक्शन उपलब्ध है जब पता लगाने के लिए शून्य मानों को छुपाना, समझना कि गोलांग यहां क्यों विफल रहता है प्रमुख अधिसूचना – एंड्रॉइड लॉलीपॉप अजगर में अंतर () और प्रकार () के बीच अंतर जावास्क्रिप्ट में घटना की पूर्वता क्या है?

एएसपी.नेट में फ़ाइलों को स्ट्रीम करने का सर्वोत्तम तरीका

ASP.NET का उपयोग करने वाली फ़ाइलों को स्ट्रीम करने का सबसे अच्छा तरीका क्या है?

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

हालांकि, यह एक विश्वसनीय विधि की तरह नहीं लगता है। विशेष रूप से, इंटरनेट एक्सप्लोरर (7) के साथ एक अजीब समस्या है, जहां ब्राउज़र केवल एक वीडियो के बाद लटका हुआ है या दो देखा जाता है। किसी भी लिंक, आदि पर क्लिक करने से कोई प्रभाव नहीं पड़ता है, और साइट पर फिर से काम करने का एकमात्र तरीका ब्राउज़र को बंद करना है और इसे पुनः खोलना है

यह अन्य ब्राउज़रों में भी होता है, लेकिन अक्सर कम होता है कुछ बुनियादी परीक्षणों के आधार पर, मुझे संदेह है कि फाइलें स्ट्रीम किए जा रहे तरीके से ऐसा कुछ है … शायद कनेक्शन ठीक से बंद नहीं किया जा रहा है, या उन पंक्तियों के साथ कुछ भी।

कुछ अलग चीजों की कोशिश करने के बाद, मैंने पाया है कि निम्नलिखित विधि मेरे लिए काम करती है:

Response.WriteFile(path); Response.Flush(); Response.Close(); Response.End(); 

यह ऊपर वर्णित समस्या के आसपास हो जाता है, और वीडियो देखने से अब इंटरनेट एक्सप्लोरर को लटका नहीं पड़ता है।

हालांकि, मेरी समझ यह है कि Response.WriteFile () पहले फ़ाइल को स्मृति में पहले लोड करता है, और यह देखते हुए कि कुछ फ़ाइलों को स्ट्रीम किया जा सकता है संभवतः काफी बड़ा हो सकता है, यह आदर्श समाधान की तरह नहीं लगता है

मैं सुन रहा हूं कि एएसपी.नेट में अन्य डेवलपर्स बड़ी फाइलें कैसे स्ट्रीम कर रहे हैं, और विशेष रूप से, एफएलवी वीडियो फ़ाइलों को स्ट्रीम करने में दिलचस्पी है I

वेब के समाधान से एकत्रित समाधान "एएसपी.नेट में फ़ाइलों को स्ट्रीम करने का सर्वोत्तम तरीका"

मैं चीजों को "एएसपीएक्स" पाइपलाइन से बाहर ले जाऊंगा विशेष रूप से, मैं एक रन हैंडलर (एशक्स, या कॉन्फ़िग के माध्यम से मैप किए गए) लिखूंगा, जो न्यूनतम काम करता है, और केवल विखंडू में प्रतिक्रिया के लिए लिखता है। हेन्डलर क्वेरी-स्ट्रिंग / फॉर्म से इनपुट को सामान्य रूप से स्वीकार कर लेगा, ऑब्जेक्ट को स्ट्रीम में ढूंढें और डेटा को स्ट्रीम करेगा (एक लूप में एक मामूली साइज वाले स्थानीय बफर का उपयोग करके)। एक सरल (अपूर्ण) उदाहरण नीचे दिखाया गया है:

 public void ProcessRequest(HttpContext context) { // read input etx context.Response.Buffer = false; context.Response.ContentType = "text/plain"; string path = @"c:\somefile.txt"; FileInfo file = new FileInfo(path); int len = (int)file.Length, bytes; context.Response.AppendHeader("content-length", len.ToString()); byte[] buffer = new byte[1024]; Stream outStream = context.Response.OutputStream; using(Stream stream = File.OpenRead(path)) { while (len > 0 && (bytes = stream.Read(buffer, 0, buffer.Length)) > 0) { outStream.Write(buffer, 0, bytes); len -= bytes; } } } 

निम्न आलेख पर एक नज़र डालें ASP.NET में बड़ी फाइल डाउनलोड करना और फिर से शुरू करना, जो आपको सिर्फ एक स्ट्रीम खोलने और सभी बिट्स को चक देते हुए गहराई में देगा।

HTTP प्रोटोकॉल, सीमाबद्ध अनुरोधों और फिर से शुरू करने योग्य डाउनलोडों का समर्थन करता है, और कई स्ट्रीमिंग क्लाइंट (जैसे वीडियो प्लेयर या एडोब पीडीएफ) कर सकते हैं और इन्हें बांटने के लिए, बैंडविड्थ को बचाने और अपने उपयोगकर्ताओं को बेहतर अनुभव देने का प्रयास करेंगे।

तुच्छ नहीं, लेकिन यह समय अच्छी तरह से बिताया है।

फ़ाइल को स्ट्रीम के रूप में खोलने का प्रयास करें, फिर प्रतिक्रिया का उपयोग करें। OutputStream.Write () उदाहरण के लिए:

संपादित करें: मेरा बुरा, मैं भूल गया था कि Write एक बाइट बफ़र लेता है स्थिर

 byte [] buffer = new byte[1<<16] // 64kb int bytesRead = 0; using(var file = File.OpenRead(path)) { while((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0) { Response.OutputStream.Write(buffer, 0, bytesRead); } } Response.Flush(); Response.Close(); Response.End(); 

2 संपादित करें: क्या आपने यह कोशिश की? यह काम करना चाहिए।

विभिन्न उत्तरों में पोस्ट किए गए कोड सहित कई अलग-अलग संयोजनों की कोशिश करने के बाद, ऐसा प्रतीत होता है कि Response.Buffer = true सेटिंग को कॉल करने से पहले TransmitFile ने चाल किया था और वेब एप्लिकेशन अब इंटरनेट एक्सप्लोरर में बहुत अधिक संवेदनशील है।

इस विशेष मामले में, एसडब्ल्यूएफ एक्सटेंशन को एएसपी.नेट पर भी मैप किया गया है, और हम डिस्क से फाइल पढ़ने के लिए कस्टम वेब हैंडलर का प्रयोग कर रहे हैं और फिर उन्हें प्रतिक्रिया के जरिए ब्राउज़र में भेज सकते हैं। ट्रांसमिशनफ़ाइल () हमारे पास वीडियो फ़ाइलों को चलाने के लिए एक फ्लैश आधारित वीडियो प्लेयर है, जो कि एसडीएफ भी हैं, और मुझे लगता है कि इस गतिविधि को बफरिंग के बिना हेन्डलर के माध्यम से जाना जाता है जो कि अजीब बातों को IE में होने का कारण हो सकता है।