सवाल कुछ डाउनलोड करने वाली फाइलें अपने आकार को क्यों नहीं जानते हैं? [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

कभी-कभी, किसी वेब ब्राउज़र में फ़ाइल डाउनलोड करते समय, डाउनलोड प्रगति फ़ाइल के कुल आकार को "पता" नहीं करती है, या डाउनलोड में कितनी दूर है - यह केवल उस गति को दिखाती है जिस पर यह डाउनलोड हो रहा है कुल "अज्ञात" के रूप में।

ब्राउज़र कुछ फ़ाइलों के अंतिम आकार को क्यों नहीं जानता? यह जानकारी पहली जगह कहां मिलती है?


79
2017-07-09 05:44


मूल


गतिशील रूप से बनाई गई फ़ाइलों का आकार नहीं होता है, वे ईओएफ तक पहुंचने तक स्ट्रीम के रूप में आते हैं। - Fiasco Labs
के संभावित डुप्लिकेट ब्राउज़र कैसे जानता है कि कितना पृष्ठ लोड किया गया है?, अनुमानित समय बाएं और कुल फ़ाइल आकार डाउनलोड में दिखाई नहीं दे रहा है ... - Karan


जवाब:


वेब सर्वर से दस्तावेज़ों का अनुरोध करने के लिए, ब्राउज़र HTTP प्रोटोकॉल का उपयोग करते हैं। आप अपने पता बार से वह नाम जान सकते हैं (यह अब छुपाया जा सकता है, लेकिन जब आप पता बार पर क्लिक करते हैं, तो यूआरएल कॉपी करें और इसे कुछ टेक्स्ट एडिटर में पेस्ट करें, आप देखेंगे http:// शुरू में)। HTTP एक साधारण पाठ-आधारित प्रोटोकॉल है। यह इस तरह काम करता है:

सबसे पहले, आपका ब्राउज़र वेबसाइट के सर्वर से जुड़ता है और उस दस्तावेज़ का यूआरएल भेजता है जिसे वह डाउनलोड करना चाहता है (वेब ​​पेज भी दस्तावेज हैं) और ब्राउजर के बारे में कुछ विवरण (उपभोक्ता अभिकर्ता आदि)। उदाहरण के लिए, सुपरयूसर साइट पर मुख्य पृष्ठ लोड करने के लिए, http://superuser.com/, मेरा ब्राउज़र एक ऐसा अनुरोध भेजता है जो इस तरह दिखता है:

GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT

पहली पंक्ति निर्दिष्ट करती है कि सर्वर को कौन सा दस्तावेज़ वापस करना चाहिए। अन्य लाइनों को हेडर कहा जाता है; वे इस तरह दिखते हैं:

Header name: Header value

ये पंक्तियां अतिरिक्त जानकारी भेजती हैं जो सर्वर को यह तय करने में सहायता करती है कि क्या करना है।

यदि सब ठीक है, तो सर्वर अनुरोधित दस्तावेज़ भेजकर जवाब देगा। प्रतिक्रिया स्थिति संदेश के साथ शुरू होती है, उसके बाद कुछ शीर्षलेख (दस्तावेज़ के बारे में विवरण के साथ) और आखिरकार, यदि सब कुछ ठीक है, तो दस्तावेज़ की सामग्री। मेरे अनुरोध के लिए सुपरयूसर सर्वर का उत्तर ऐसा ही है:

HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672

<!DOCTYPE html>
<html>
    [...snip...]
</html>

अंतिम पंक्ति के बाद, सुपरयूसर का सर्वर कनेक्शन बंद कर देता है।

पहली पंक्ति (HTTP/1.1 200 OK) में शामिल हैं रेस्पोंस कोड, इस मामले में यह है 200 OK। इसका मतलब है कि सर्वर ने निर्णय लिया है कि यह अनुरोध के अनुसार एक दस्तावेज वापस कर सकता है, और वादा करता है कि जो सामग्री का पालन किया जाएगा वह ऐसा दस्तावेज होगा। यदि ऐसा नहीं है तो कोड कुछ और होगा, और यह कारण बताएगा कि सर्वर सिर्फ एक दस्तावेज़ को प्रतिक्रिया के रूप में वापस नहीं कर रहा है: उदाहरण के लिए, यदि अनुरोधित दस्तावेज़ नहीं मिल रहा है, तो उसे वापस जाना होगा 404 Not Found, और यदि आपको प्रश्न में सामग्री तक पहुंचने की अनुमति नहीं है तो उसे वापस जाना होगा 403 Forbidden

इस पहली स्थिति रेखा के बाद, प्रतिक्रिया शीर्षलेख का पालन करें; वे वापस आने वाली सामग्री के बारे में अधिक जानकारी प्रदान करते हैं, जैसे कि Content-type

अगला एक खाली रेखा है। यह इस तथ्य को संकेत देता है कि कोई भी प्रतिक्रिया शीर्षलेख का पालन नहीं करेगा। उस पंक्ति के पीछे सबकुछ उस दस्तावेज़ की सामग्री है जिसने अनुरोध किया था। तो उपर्युक्त उदाहरण में, <!DOCTYPE html> SuperUser होम पेज (एक HTML दस्तावेज़) की पहली पंक्ति है। अगर मैं डाउनलोड करने के लिए दस्तावेज़ का अनुरोध कर रहा था, तो शायद यह कुछ अस्पष्ट पात्र होंगे, क्योंकि अधिकांश दस्तावेज़ प्रारूप पूर्व प्रसंस्करण के बिना अपठनीय हैं।

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

वैसे भी, जो भी कारण है, हेडर गायब हो सकता है। उस स्थिति में ब्राउज़र नहीं जानता कि सर्वर कितना डेटा भेजने जा रहा है, और इस प्रकार दस्तावेज़ आकार को प्रदर्शित करता है अनजान, कनेक्शन को बंद करने के लिए सर्वर की प्रतीक्षा कर रहा है। और यही अज्ञात दस्तावेज़ आकार का कारण है।


110
2017-07-09 07:51



एक बहुत ही मामूली नोट: ब्राउजर HTTP के अलावा अन्य प्रोटोकॉल का समर्थन करते हैं। लेकिन इन दिनों अन्य प्रोटोकॉल दुर्लभ हैं, और अनिवार्य रूप से वही अवधारणाएं अन्य प्रोटोकॉल पर लागू होती हैं, भले ही विवरण अलग-अलग हों। - Robert Fisher
@RobertFisher एफ़टीपी एक दुर्लभ प्रोटोकॉल है? : p - Thomas
@ थॉमस इन दिनों मेरा अनुभव है। मेरे ब्राउज़र में एक FTP यूआरएल देखने के बाद से कई सालों रहे हैं। कुछ साल पहले मैं एक ब्राउज़र-काम (लगभग पूरी तरह से अपलोड) के बजाय ftp-straight का उपयोग कर रहा था, लेकिन उन कार्यों को अब स्कैप द्वारा नियंत्रित किया जाता है। एकमात्र चीज जो मैं आज के लिए ftp का उपयोग करता हूं वह कम से कम वेब होस्ट पर सामग्री अपलोड कर रहा है। बेशक, वाईएमएमवी। ^ _ ^ - Robert Fisher
यह वास्तव में ऐसा उत्तर है जो मुझे इस साइट से प्यार करता है। मैं इसे एक बक्षीस कैसे दे सकता हूं? - That Brazilian Guy
आप से @ ruda.almeida इससे असहमत हैं, आप मेटा.superuser.com पर इसके बारे में पोस्ट कर सकते हैं, इसकी चर्चा की जाएगी और शायद कोई प्रश्न फिर से खोल देगा। - gronostaj


HTTP Content-Length कुछ मामलों में हेडर वैकल्पिक है, और इस तरह यह फ़ाइल के साथ संचरित नहीं किया जा सकता है; सॉकेट बंद होने पर फ़ाइल का अंत संकेत दिया जाएगा।


52
2017-07-09 05:52



सटीक होने के लिए, HTTP 1.0 प्रत्येक दस्तावेज़ के बाद सॉकेट को बंद करके सामग्री की लंबाई को परिभाषित करता है। यह अभी भी संगतता के लिए HTTP 1.1 में समर्थित है। लेकिन HTTP 1.1 एकाधिक दस्तावेज़ों के लिए कनेक्शन का पुन: उपयोग करने की अनुमति देता है यदि या तो Content-Length हेडर फ़ील्ड का उपयोग किया जाता है या दस्तावेज़ को स्थानांतरित किया जाता है Transfer-Encoding: chunked। उत्तरार्द्ध गतिशील रूप से सामग्री उत्पन्न करने और इसे टुकड़े टुकड़े भेजने की अनुमति देता है क्योंकि यह उत्पन्न होता है और दस्तावेज़ के अंत को संकेत देने में सक्षम होता है। - x4u


जब सामग्री (उदा। ए .pdf दस्तावेज़ या एक्सेल शीट) फ्लाई पर बनाया गया है जिसे आकार पहले नहीं जाना जा सकता है। इस मामले में सर्वर आपको पहले डाउनलोड का आकार नहीं भेज सकता है और ब्रोवर कुल आकार प्रदर्शित नहीं कर सकता है।


3
2017-07-09 06:14



@ आधे को असहमत होना होगा ... अगर मैं वीडियो स्ट्रीम कर रहा हूं, या यहां तक ​​कि अगर मैं किसी भी प्रकार का डेटा स्ट्रीम कर रहा हूं जो एक निश्चित आकार नहीं है, तो यदि बिंदु उपयोगकर्ता को जितनी जल्दी हो सके डेटा प्राप्त करना है, मैं उस बिंदु पर आकार नहीं जानूंगा जहां मैं ट्रांसमिटल शुरू करता हूं - Foon
@Alfo आप जैसे डेटा बना सकते हैं .pdf फ्लाई पर फाइलें। जब तक डेटा प्रतिस्पर्धात्मक रूप से लिखा नहीं जाता है तब तक आप आकार को नहीं जानते हैं लेकिन आप पहले से ही ब्राउज़र पर एटीए भेज सकते हैं। मैंने इसे पहले ही जावा में किया है और एक्सेल फ़ाइल को ब्राउज़र पर भेजा है जो फ्लाई पर जेनरेट किया गया है। ब्राउज़र पक्ष से यह एक डाउनलोड की तरह लग रहा था लेकिन सर्वर की ओर से यह एक स्ट्रीमिंग है। तो यह संभव है धारा  .pdf अगर आप कल्पना नहीं करते हैं तो भी फाइलें। ब्राउज़र से यह ज्ञात लंबाई के बिना डाउनलोड की तरह दिखता है। - Uwe Plonus
@Alfo - क्लाइंट को अंतिम पैकेट भेजा जाने से पहले इसे केवल समाप्त होने की आवश्यकता है। - GalacticCowboy
@Alfo मैंने कभी नहीं लिया है वीडियो स्टीमिंग लेकिन के बारे में स्ट्रीमिंग सामान्य रूप से, जो स्ट्रीमिंग भी कर सकते हैं .pdf फ़ाइल या एक्सेल शीट! - Uwe Plonus
@Alfo - आपके पास एक वैध बिंदु है, गतिशील फ़ाइलों को पूरी तरह से स्मृति में पहले बनाया जा सकता है और फिर HTTP के माध्यम से भेजा जा सकता है और सामग्री की लंबाई की गणना करना आसान होता है। हालांकि, यदि सर्वर कई बड़ी गतिशील रूप से बनाई गई फ़ाइलों को भेज रहा है जो कई पैकेट में विभाजित हो जाएंगे, तो यह समझ में आता है कि सर्वर की गणना की जाती है क्योंकि वे गणना की जाती हैं (बनाम स्मृति में हर बड़ी फ़ाइल बनाने के लिए और उसके बाद भेज दे)। HTTP 1.1 विशेष रूप से डिजाइन किया गया खंडित स्थानांतरण एन्कोडिंग इस उद्देश्य के लिए। - dr jimbob