2009-12-06 7 views
5

मेरे पास एक सिल्वरलाइट एप्लिकेशन है जिसे सर्वर पर बड़ी फ़ाइलों को अपलोड करने की आवश्यकता है। मैंने दोनों वेब क्लाइंट के साथ-साथ एक HttpWebRequest का उपयोग करके अपलोड करने पर भी ध्यान दिया है, हालांकि मुझे किसी भी विकल्प के साथ अपलोड को स्पष्ट तरीके से स्ट्रीम नहीं किया गया है। फ़ाइलों के आकार के लिए, अपलोडिंग से पहले पूरी सामग्री को स्मृति में लोड करना उचित नहीं है। क्या यह सिल्वरलाइट में संभव है?सिल्वरलाइट स्ट्रीमिंग अपलोड

+0

+1 वास्तव में एक अच्छा सवाल है, मेरी इच्छा है कि मेरा कोई अच्छा जवाब हो। हम किस फाइल के बारे में बात कर रहे हैं? – AnthonyWJones

+0

वहाँ WAV फाइलें जो लगभग 150+ मेग्स – herbrandson

उत्तर

1

आप "चंकिंग" दृष्टिकोण के साथ जा सकते हैं। सिल्वरलाइट फ़ाइल Codeplex पर अपलोडर इस तकनीक का उपयोग करता:

http://www.codeplex.com/SilverlightFileUpld

एक हिस्सा आकार को देखते हुए (जैसे 10k, 20k, 100k, आदि), तो आप फ़ाइल को विभाजित और एक HTTP का उपयोग कर सर्वर पर प्रत्येक हिस्सा भेज सकते हैं निवेदन। सर्वर को प्रत्येक खंड को संभालने और फ़ाइल को दोबारा इकट्ठा करने की आवश्यकता होगी क्योंकि प्रत्येक खंड आता है। एक वेब फार्म परिदृश्य में जब कई वेब सर्वर होते हैं - इस दृष्टिकोण के लिए वेब सर्वर पर स्थानीय फ़ाइल सिस्टम का उपयोग न करने के लिए सावधान रहें।

+0

'भाग' को बनाए रखने के बारे में कोई विचार 'सर्वर की तरफ (डब्ल्यूसीएफ में कहें) और पुनः इकट्ठा? – atconway

+1

मैंने दो तकनीकों का उपयोग किया है: 1) फ़ाइल सिस्टम पर फ़ाइल के रूप में प्रत्येक खंड को फ़ाइल के रूप में सहेजें, फिर सभी हिस्सों को लिखने के बाद उचित क्रम में फ़ाइलों को दोबारा इकट्ठा करें और 2) प्रत्येक खंड को बाइनरी डेटा के रूप में सहेजें एक डेटाबेस और फिर फिर से इकट्ठा। यदि आपकी साइट को एक से अधिक वेब सर्वर में संतुलित किया जा रहा है तो आपको तकनीक # 2 या किसी प्रकार की वितरित फ़ाइल सिस्टम का उपयोग करने की आवश्यकता होगी। – kindohm

+0

चूंकि मेरा फ़ाइल सिस्टम स्थान उसी सर्वर पर रहता है जहां डब्ल्यूसीएफ सर्वर मौजूद है और यह * लोड * संतुलित लोड सर्वर नहीं है, मुझे लगता है कि # 1 वास्तव में अच्छा काम करेगा। क्या आपके पास भाग लिखने और पुनः संयोजित करने के कोई उदाहरण हैं? आप किस प्रकार के पाठक/लेखक का उपयोग करेंगे। सहायता के लिए धन्यवाद। – atconway

1

यह असाधारण प्रतीत होता है कि सिल्वरलाइट में वेब क्लाइंट प्रगति की घटनाओं के साथ सर्वर को स्ट्रीम पंप करने का साधन प्रदान करने में विफल रहता है। यह एक विशेष रूप से अद्भुत है क्योंकि यह एक स्ट्रिंग अपलोड के लिए पेश किया जाता है!

यह कोड करना संभव है कि आप HttpWebRequest के साथ क्या करना चाहते हैं।

BeginGetRequestStream के लिए कॉल में वापस आप आउटगोइंग अनुरोध के लिए स्ट्रीम प्राप्त कर सकते हैं और फिर अपनी फ़ाइल के स्ट्रीम से भाग पढ़ सकते हैं और उन्हें आउटपुट स्ट्रीम में लिख सकते हैं। दुर्भाग्यवश सिल्वरलाइट आउटपुट स्ट्रीम बंद होने तक आउटपुट को सर्वर पर भेजना शुरू नहीं करता है। इस दौरान यह सब डेटा संग्रहीत होने के बाद समाप्त होता है, मुझे नहीं पता, यह संभव है कि यदि यह पर्याप्त हो जाता है तो एसएल एक अस्थायी फ़ाइल का उपयोग कर सकता है ताकि मशीन मेमोरी पर दबाव न डाले, लेकिन फिर यह इसे स्मृति में संग्रहीत कर सकता है वैसे भी।

संभवतः इसका एकमात्र समाधान सॉकेट के माध्यम से HTTP प्रोटोकॉल लिखना संभव है।

+0

तक हो सकती हैं, मैं सॉकेट के बारे में थोड़ा सा पता लगाता हूं और मुद्दा यह है कि सिल्वरलाइट सॉकेट पोर्ट 80 (केवल 4502 से 4534) से कनेक्ट नहीं हो सकता है – herbrandson

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