2009-12-24 17 views
8

मैं इस तरह के कुछ के लिए ASP.net/C# के साथ एक सिस्टम तैयार करने की कोशिश कर रहा हूं।एएसपीनेट फ़ाइल डाउनलोडिंग - डाउनलोड किए गए आकार को ट्रैक करें

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

क्या क्लाइंट द्वारा सफलतापूर्वक डाउनलोड किए गए बाइट्स की संख्या को ट्रैक रखने का कोई तरीका है?

जब भी मैं अपने विनएक्सपी मशीन में फ़ाइल आकार देखता हूं, तो मुझे दो आकार (आकार, आकार पर आकार) दिखाई देता है। मुझे किस पर विचार करना चाहिए? और क्या यह एक ओएस से दूसरे में अलग होगा?

+0

मेरा मानना ​​है कि डिस्क पर आकार एक तुम चाहते हो सकता है। डाउनलोड की निगरानी पर अच्छा सवाल है। दूसरों के उत्तरों को भी देखने में दिलचस्पी है। –

+1

आप बता सकते हैं कि आपने बाइट्स भेजा है। एचटीपी 100% सुनिश्चित करने का तरीका प्रदान नहीं करता है कि उन्हें उन्हें प्राप्त हुआ। –

+0

उपयोगकर्ता सामग्री के लिए भुगतान कब करता है? क्या यह डाउनलोड करने या बाद में है? क्योंकि अगर मैं कुछ फाइल के लिए भुगतान करता हूं, तो मैं इसे डाउनलोड करने में सक्षम होना चाहता हूं ... लगभग 2 आकार। फ़ाइल का आकार = फ़ाइल की लंबाई (फ़ाइल में बाइट्स की संख्या) फाइलों की डिस्क = # फाइलों पर फ़ाइल का आकार * लंबाई (क्लस्टर) आपको केवल फ़ाइल आकार की आवश्यकता है, क्योंकि डिस्क पर आकार फ़ाइल सिस्टम और क्लस्टर पर निर्भर करता है आकार। – Vitaly

उत्तर

1

आप एक एएसपीनेट हैंडलर बना सकते हैं जो फ़ाइल परोसता है (asp.net mvc के लिए आप परिणामस्वरूप कार्रवाई कर सकते हैं ... यही वह है जो मैं उपयोग कर रहा हूं)। सुनिश्चित करें कि यह पुन: प्रारंभ करने योग्य डाउनलोड का समर्थन करता है।

आप से जुड़े बाइट ट्रैक कर सकते हैं।

Ps। यह एक प्रदर्शन भूमि के ऊपर दे आईआईएस की सेवा यह

अद्यतन 1 बनाम पड़ता है: मैं बहुत इस http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx को कुछ इसी तरह इस्तेमाल किया ... और लेख क्या यह अंदर पर एक बहुत स्पष्ट व्याख्या है। आप संभवतः उस का उपयोग कर सकते हैं, उस पोस्ट में उदाहरण देखें।

+0

क्या आप मुझे एक उदाहरण के लिए इंगित कर सकते हैं? – ram

+0

@ram ने इसे अभी अपडेट के रूप में जोड़ा है। – eglasius

1

आप HTTP रिस्पॉन्स कोड (यानी: 200, 404 इत्यादि) में देखने का प्रयास कर सकते हैं - क्लाइंट और सर्वर http हेडर का आदान-प्रदान कर रहे हैं ताकि वे जान सकें कि क्या हो रहा है - आपको यह देखने के लिए इन पर नजर रखने में सक्षम होना चाहिए कि क्या reponses सफल था (यकीन नहीं है - लेकिन आप करने में सक्षम होना चाहिए)।

फ़ाइल आकार के संबंध में - मैं 'ज्ञात' आकार वाली फ़ाइलों पर प्रयोगों का प्रयास करूंगा, तुलना करें कि एचटीपी लॉग आपको बताएंगे कि कौन सी फाइल एक्सप्लोरर आपको बताती है।

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

+0

+1 मैंने इस तरह कुछ भी सोचा, लेकिन मेरे लिए यह स्पष्ट नहीं है कि आप सभी कार्यों में न्यूनतम ओवरहेड वाले लोगों की जांच कैसे करेंगे। मेरे मामले में, मैंने विभिन्न कारणों से एएसपीएनटी एमवीसी एक्शन्रेसल्ट का इस्तेमाल किया। – eglasius

+0

क्लाइंट ब्राउज़र को प्रतिक्रिया कोड प्राप्त होते हैं। सर्वर प्रतिक्रिया कोड भेजता है, प्रतिक्रिया कोड अभी भी 200 हो सकता है, लेकिन फ़ाइल डाउनलोड करते समय क्लाइंट डिस्कनेक्ट हो सकता है, क्या आप सहमत होंगे? – ram

+0

जाहिर है कि अपलोड कोड को देखने के साथ समस्या यह है कि क्लाइंट और सर्वर के बीच सापेक्ष जिम्मेदारियों को उलट दिया जाता है - इसलिए यह सहायक नहीं हो सकता है, लेकिन ऐसे Iideas के बाद मुझे अतीत में मदद मिली है। –

0

आकार जो आप चाहते हैं वह आकार (डिस्क पर आकार नहीं) है। डिस्क पर आकार में अतिरिक्त स्थान शामिल होता है जो विभाजन के 4K ब्लॉक आकार में फ़िट करके लिया जाता है। आकार फ़ाइल में बिट्स की सटीक संख्या है।

मुझे विश्वास नहीं है कि एक डाउनलोड पूरा हो गया है यह बताने का एक अच्छा तरीका है। Response.TransmitFile शायद फ़ाइल को सुरक्षित रूप से भेजने के लिए सबसे अच्छी विधि है। लेकिन मुझे विश्वास नहीं है कि इसमें कुछ भी है जो आपको बताएगा कि उपयोगकर्ता वास्तव में फ़ाइल प्राप्त कर लेता है या नहीं।

मुझे इस व्यवसाय के बारे में पता नहीं है, लेकिन मैं एक वैध व्यवसाय के बारे में नहीं सोच सकता जहां उपयोगकर्ता प्रति खरीद मॉडल को एक ही डाउनलोड सहन करेंगे, और मानक HTTP अनुरोध/प्रतिक्रिया मॉडल की अबाधता के साथ एक सटीक ग्राहक पक्ष प्राप्त करने के लिए खुद को उधार नहीं देते हैं। इस मॉडल का जिक्र नहीं किया जा सकता है कि आखिरी पैकेट के प्राप्त होने पर असफल प्रतिक्रिया भेजकर इस मॉडल को आसानी से हैक किया जा सकता है।

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

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

7

आप आसानी से आप अपने खुद के साथ एक सीधा आईआईएस नियंत्रित डाउनलोड की जगह है, जो कुछ इस तरह जाना होगा यह सोचते हैं ASP.NET में ग्राहक को पारित कर दिया डेटा को माप सकते हैं:

while (context.Response.IsClientConnected) { 

    bytesRead = ReadFileChunkAsByteArrayWIthOffsetOrWhatever(buffer, offset); 

    context.Response.OutputStream.Write(buffer, 0, bytesRead); 
    context.Response.Flush(); 

    offset += bytesRead; 

    if (bytesRead != bufferSize) 
     break; 
} 

यह इस 100 बनाने के लिए जटिल है एएसपी के भीतर से विश्वसनीय, लेकिन यह किया जा सकता है। आपको हर संभावित विफलता बिंदु के लिए बहुत अधिक ध्यान देना होगा और तदनुसार प्रतिक्रिया देना होगा।

समस्या हालांकि अभी भी है - जैसा ऊपर बताया गया है - को यह असंभव है कि क्लाइंट को डेटा प्राप्त हुआ। यदि इस लेनदेन में पैसा शामिल है, तो यह वास्तव में एक समस्या हो सकती है।

इसी कारण से, कस्टम डाउनलोडर क्लाइंट का उपयोग करने का सबसे अच्छा तरीका होगा, जैसे अमेज़ॅन एमपी 3 फ़ाइल खरीद के लिए उपयोग करता है। इस तरह आप अपने आप को या अपने ग्राहकों को HTTP के रूप में अविश्वसनीय रूप से मुद्रीकृत बिट्स को स्थानांतरित करने की अनियमितताओं के अधीन नहीं हैं।

+1

+1 कस्टम क्लाइंट साइड डाउनलोडर केवल व्यवहार्य समाधान की तरह लगता है। –

+0

फ़ाइल को स्मृति में पढ़ना, यदि आप इन परिचालनों में से बहुत कुछ कर रहे हैं तो यह एक विशाल परफॉर्मेंस समस्या का कारण बन जाएगा और अच्छी तरह से स्केल नहीं करेगा। इसका नतीजा यह है कि आप OfMemoryExceptions को फेंक देंगे। आप क्या करना चाहते हैं Response.TransferFile (स्ट्रिंग फ़ाइल नाम), या Respone.Transfer (स्ट्रिंग फ़ाइल नाम, लंबे ऑफसेट, लंबी लंबाई) विधि का उपयोग करें। –

1

इस तरह की कस्टम बाइट सेवा करने के लिए, आपको अपने स्वयं के http हैंडलर को लागू करने की आवश्यकता होगी।

  • , http हैंडलर पर प्रमाणीकरण के कुछ प्रकार लागू तो आप जानते हैं कि आप किसके साथ काम कर रहे हैं:

    यह हैंडलर निम्न करना चाहिए।

  • फिर आपको अनुरोध की गई फ़ाइलों के लिए किसी प्रकार की लॉगिंग को लागू करने की आवश्यकता होगी और फ़ाइलों को डाउनलोड करने की अनुमति है।
  • ईटैग लागू करें और क्लाइंट साइड कैशिंग के लिए शीर्षलेख समाप्त हो जाएंगे।
  • सर्वर साइड संचय
  • Deflate, gzip संपीड़न
  • आप पुन: प्रारंभ योग्य डाउनलोड का समर्थन करना चाहते हैं, तो आप 206 आंशिक प्रतिक्रियाओं को लागू करने की आवश्यकता होगी। यह किसी भी तरह की स्ट्रीमिंग और पीडीएफ की सेवा के लिए आवश्यक है।

तो तुम से निपटने की जानी चाहिए निम्नलिखित http हेडर:

  • ETag
  • समय-सीमा समाप्त

  • स्वीकार करें-रेंज

  • रेंज
  • हैं रेंज

  • Last-Modified

  • हैं-मैच
  • तो कोई मिलान नहीं वाले
  • यदि संशोधित के बाद से
  • हैं-असंशोधित-चूंकि
  • जब तक-संशोधित- क्योंकि

की जाँच आप देख रहे हैं http संचालकों का एक नमूना कार्यान्वयन के लिए: http://code.google.com/p/talifun-web/wiki

,210

यह एक स्थिर फ़ाइल हैंडलर कि सब से ऊपर http हेडर, क्लाइंट पक्ष और सर्वर साइड कैशिंग और यहां तक ​​कि संपीड़न लागू करता है।

वहाँ भी एक लॉग मॉड्यूल और एक प्राधिकरण मॉड्यूल है कि कैसे प्रमाणीकरण और प्रवेश को लागू करने में एक लंबा रास्ता तय करना चाहिए।

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