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


82

इस सवाल का पहले से ही यहाँ एक जवाब है:

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

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


13
गतिशील रूप से बनाई गई फ़ाइलों का आकार नहीं होता है, वे EOF तक पहुंचने के लिए एक धारा के रूप में आते हैं।
फासको लैब्स

जवाबों:


114

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

सबसे पहले, आपका ब्राउज़र वेबसाइट के सर्वर से जुड़ता है और उस दस्तावेज़ का एक URL भेजता है जिसे वह डाउनलोड करना चाहता है (वेब ​​पेज दस्तावेज़ भी हैं) और ब्राउज़र के बारे में कुछ विवरण ( उपयोगकर्ता-एजेंट आदि)। उदाहरण के लिए, SuperUser साइट पर मुख्य पृष्ठ को लोड करने के लिए, 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

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

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

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>

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

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

इस पहली स्टेटस लाइन के बाद, रिस्पॉन्स हेडर फॉलो करते हैं; वे लौटाई जा रही सामग्री के बारे में अधिक जानकारी प्रदान करते हैं, जैसे कि इसके Content-type

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

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

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


4
एक बहुत ही मामूली नोट: ब्राउज़र्स HTTP के अलावा अन्य प्रोटोकॉल का समर्थन करते हैं। लेकिन अन्य प्रोटोकॉल इन दिनों दुर्लभ हैं, और अनिवार्य रूप से एक ही अवधारणा अन्य प्रोटोकॉल पर लागू होती है, हालांकि विवरण अलग-अलग होते हैं।
रॉबर्ट फिशर

5
@RobertFisher एफ़टीपी एक दुर्लभ प्रोटोकॉल है? : पी
थॉमस

5
@ थोमस जो इन दिनों मेरा अनुभव है। मुझे अपने ब्राउज़र में एक ftp URL देखकर याद आने में कई साल हो गए हैं। कुछ साल पहले मैं एक ब्राउज़र के बजाय सीधे ftp का उपयोग कर रहा था - काम पर (लगभग पूरी तरह से अपलोड), लेकिन उन कार्यों को अब scp द्वारा नियंत्रित किया जाता है। आज के लिए केवल एक चीज जो मैं ftp का उपयोग करता हूं वह है एक न्यूनतम वेब होस्ट पर सामग्री अपलोड करना। बेशक, YMMV। ^ _ ^
रॉबर्ट फिशर

2
यह बिल्कुल उसी तरह का जवाब है जो मुझे इस साइट से प्यार करता है। मैं इसे कैसे एक अनुदान दूं?
वह ब्राजील के लड़के

1
@ ruda.almeida आप इससे असहमत हैं, आप इसके बारे में meta.superuser.com पर पोस्ट कर सकते हैं, इस पर चर्चा की जाएगी और हो सकता है कि कोई इस सवाल को फिर से खोल देगा।
गोरोस्तज

54

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


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

3

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


9
@alfo को असहमत होना है ... अगर मैं वीडियो स्ट्रीमिंग कर रहा हूं, या यहां तक ​​कि अगर मैं किसी भी प्रकार का डेटा स्ट्रीमिंग कर रहा हूं, तो निश्चित आकार नहीं है, अगर बिंदु उपयोगकर्ता को डेटा जितनी जल्दी हो सके, मैं उस बिंदु पर आकार नहीं जान
पाऊंगा

4
@ शेल्फ आप .pdfमक्खी पर फ़ाइलों की तरह डेटा बना सकते हैं। जब तक डेटा सक्षम नहीं लिखा जाता है तब तक आपको आकार का पता नहीं चलता है लेकिन आप पहले से ही ब्राउज़र में एटा भेज सकते हैं। मैंने इसे पहले ही जावा में कर लिया है और ब्राउज़र पर एक एक्सेल फाइल भेजी है जो कि मक्खी पर उत्पन्न होती है। ब्राउज़रों की तरफ से यह एक डाउनलोड की तरह दिखता था लेकिन सर्वर की तरफ से यह एक स्ट्रीमिंग है। इसलिए यदि आप इस बात की कल्पना नहीं करते हैं तो भी फाइलों को स्ट्रीम करना संभव है .pdf। ब्राउज़र से यह ज्ञात लंबाई के बिना डाउनलोड की तरह दिखता है।
उवे प्लोनस

8
@ एफ़्लो - इसे केवल ग्राहक को भेजे जाने वाले अंतिम पैकेट से पहले तैयार किया जाना चाहिए।
गैलेक्टीकॉवॉय

4
@Alfo मैंने कभी भी वीडियो स्टीमिंग के बारे में नहीं सोचा है, लेकिन सामान्य रूप से स्ट्रीमिंग के बारे में, जो किसी .pdfफ़ाइल या एक्सेल शीट की स्ट्रीमिंग भी हो सकती है !
उवे प्लोनस

2
@Alfo - आपके पास एक वैध बिंदु है, डायनेमिक फ़ाइलों को पूरी तरह से पहले मेमोरी में बनाया जा सकता है और फिर HTTP के माध्यम से भेजा जा सकता है और सामग्री की लंबाई की गणना करने में आसान है। हालाँकि, यदि सर्वर कई बड़ी डायनामिक रूप से बनाई गई फ़ाइलों को भेज रहा है जो कई पैकेटों में टूट जाएगा, तो यह सर्वर के लिए सिर्फ चंक्स भेजना शुरू करने के लिए समझ में आता है क्योंकि उनकी गणना की जाती है (और प्रत्येक बड़ी फ़ाइल को मेमोरी में बनाने के लिए और फिर भेज दे)। HTTP 1.1 ने विशेष रूप से इस उद्देश्य के लिए चंक्ड ट्रांसफर एन्कोडिंग डिज़ाइन किया है ।
डॉम्ब जिंबाब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.