سؤال لماذا لا تعرف بعض ملفات التنزيل حجمها الخاص؟ [مكرر]


هذا السؤال لديه بالفعل إجابة هنا:

من حين لآخر ، عند تنزيل ملف في متصفح ويب ، لا يعرف "حجم التنزيل" الحجم الإجمالي للملف ، أو إلى أي مدى يتم تنزيله - إنه فقط يعرض سرعة تنزيله ، الإجمالي "غير معروف".

لماذا لا يعرف المتصفح الحجم النهائي لبعض الملفات؟ من أين تحصل على هذه المعلومات في المقام الأول؟


79
2017-07-09 05:44


الأصل


لا يكون للملفات التي تم إنشاؤها ديناميكيًا حجمًا ، ولكنها تأتي على شكل دفق حتى يتم الوصول إلى EOF. - Fiasco Labs
ممكن نسخة من كيف يعرف المتصفح حجم الصفحة التي تم تحميلها؟، الوقت المقدر لليسار والحجم الإجمالي للملف لا يظهران في التنزيل ... - Karan


الأجوبة:


لطلب مستندات من خوادم الويب ، تستخدم المتصفحات بروتوكول 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> هو السطر الأول من الصفحة الرئيسية لـ SuperUser (مستند HTML). إذا كنت أطلب مستندًا لتنزيله ، فمن المحتمل أن يكون بعض الأحرف المبهمة ، لأن معظم تنسيقات المستندات غير قابلة للقراءة بدون معالجة مسبقة.

العودة إلى الرؤوس. الأكثر إثارة بالنسبة لنا هو آخر واحد ، Content-Length. فهي تقوم بإعلام المستعرض بعدد وحدات البايت من البيانات التي يجب أن تتوقعها بعد السطر الفارغ ، لذلك يكون حجم المستند المعبر عنه بالبايت. هذا العنوان ليس إلزاميًا وقد يتم حذفه بواسطة الخادم. في بعض الأحيان لا يمكن التنبؤ بحجم الوثيقة (على سبيل المثال عندما يتم إنشاء المستند على الطاير) ، في بعض الأحيان لا يقوم المبرمجون البطيئون بتضمينه (وهو أمر شائع جدًا في مواقع تنزيل برامج التشغيل) ، أحيانًا يتم إنشاء مواقع ويب بواسطة newbies الذين لا يعرفون من هذه الرأس.

على أي حال ، مهما كان السبب ، يمكن أن يكون العنوان مفقودًا. في هذه الحالة ، لا يعرف المتصفح مقدار البيانات التي سيرسلها الخادم ، وبالتالي يعرض حجم المستند كـ غير معروف، في انتظار الخادم لإغلاق الاتصال. وهذا هو سبب أحجام الوثائق غير المعروفة.


110
2017-07-09 07:51



ملاحظة بسيطة جدًا: تدعم المتصفحات بروتوكولات غير HTTP. لكن بروتوكولات أخرى نادرة في هذه الأيام ، وأساسًا ، تنطبق المفاهيم نفسها على البروتوكولات الأخرى على الرغم من أن التفاصيل مختلفة. - Robert Fisher
RobertFisher FTP هو بروتوكول نادر؟ : ع - Thomas
هذا هو تجربتي هذه الأيام. مرّت عدة سنوات منذ أتذكر رؤية عنوان URL لـ ftp في المتصفح. قبل بضع سنوات ، كنت أستخدم بروتوكول نقل الملفات (ftp) - بشكل مباشر وليس مع متصفح - في العمل (عمليات تحميل كاملة تقريبًا) ، ولكن يتم التعامل مع هذه المهام بواسطة scp الآن. الشيء الوحيد الذي أستخدم فيه ftp لهذا اليوم هو تحميل المحتوى إلى مضيف ويب بسيط. بالطبع ، YMMV. ^ _ ^ - Robert Fisher
هذا هو بالضبط نوع الإجابة التي تجعلني أحب هذا الموقع. كيف أقوم بمنحه مكافأة؟ - That Brazilian Guy
@ ruda.almeida من أنت لا توافق على ذلك ، يمكنك نشره على meta.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 مستند أو ورقة Excel) يتم إنشاؤه على الطاير لا يمكن معرفة الحجم من قبل. في هذه الحالات ، يتعذر على الخادم إرسال حجم التنزيل من قبل ، ولا يمكن للمعرض عرض الحجم الإجمالي.


3
2017-07-09 06:14



سيتوجب علىalfo عدم الموافقة ... إذا كنت أتدفق الفيديو ، أو حتى إذا كنت أتدفق أي نوع من البيانات ليس بحجم ثابت ، إذا كان الهدف هو الحصول على البيانات إلى المستخدم في أسرع وقت ممكن ، لن أعرف الحجم في النقطة التي أبدأ فيها الإرسال - Foon
Alfo يمكنك إنشاء بيانات مثل .pdf الملفات على الطاير. طالما لم تتم كتابة البيانات بكفاءة ، فأنت لا تعرف حجمها ولكن يمكنك إرسالها بالفعل إلى المتصفح. لقد فعلت هذا بالفعل في جاوة وأرسلت ملف Excel إلى المتصفح الذي ولدت على الطاير. من جانب المتصفحات بدا وكأنه تنزيل ولكن من جانب الخوادم هو تدفق. لذلك من الممكن مجرى  .pdf ملفات حتى لو كنت تتخيل هذا. يبدو من المستعرض تنزيلًا بدون طول معروف. - Uwe Plonus
Alfo - تحتاج فقط إلى الانتهاء من الإنشاء قبل إرسال الحزمة الأخيرة إلى العميل. - GalacticCowboy
Alfo لم أتناولها أبدًا فيديو تبخير ولكن حول تدفق بشكل عام ، والتي يمكن أيضا أن يكون تدفق .pdf ملف أو ورقة إكسل! - Uwe Plonus
Alfo - لديك نقطة صحيحة ، يمكن إنشاء الملفات الديناميكية أولاً في الذاكرة ثم إرسالها عبر HTTP ومن السهل حساب طول المحتوى. ومع ذلك ، إذا كان الخادم يرسل العديد من الملفات الكبيرة التي تم إنشاؤها ديناميكيًا والتي سيتم تقسيمها إلى العديد من الحزم ، فمن المنطقي أن يبدأ الخادم في إرسال الأجزاء عند حسابها (مقابل الحاجة إلى إنشاء كل ملف كبير في الذاكرة ثم ارسلها). HTTP 1.1 صمم خصيصا ترميز نقل مقسم لهذا الغرض. - dr jimbob