سؤال لماذا يقوم Chrome أحيانًا بتنزيل ملف PDF بدلاً من فتحه؟ [مكرر]


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

عندما أذهب إلى عناوين معينة لملفات PDF ، يقوم Chrome بتنزيل ملف PDF بدلاً من فتحه باستخدام عارض PDF المدمج. الصفحة ثم بيضاء فارغة.

لا توجد مشكلة في إعدادات Chrome: أحاول عناوين ملفات PDF الأخرى ، ويتصرف Chrome بالشكل المتوقع (لقد قمت بتعيينه لاستخدام عارض PDF المدمج في Chrome). ولكن في كل مرة أحاول فيها نفس العنوان الإشكالي ، يقوم Chrome بتنزيل ملف PDF ثم يعرض صفحة فارغة.

أستخدم نظام التشغيل Windows 10 و Chrome Version 63.0.3239.84 (Official Build) (64-bit).

بلدي عنوان إشكالية محددة هذه المرة هنا (نتيجة بحث Google).


110
2017-12-17 07:00


الأصل




الأجوبة:


في الأساس ، يحدث هذا لأن الموقع يخبر المتصفح بذلك. من حين لآخر ، يرجع السبب في ذلك إلى أن مطور موقع الويب قرر أنه يريد هذا السلوك ، على سبيل المثال ، شائعة في مواقع مشاركة الملفات. في أحيان أخرى ، يرجع السبب في ذلك إلى أنه خيار افتراضي لأي برنامج يستخدمه (على سبيل المثال ، منتدى أو برنامج تدوين). في بعض الأحيان يرجع السبب في ذلك إلى أن مطوّر مواقع الويب لا يملك أي فكرة عما يفعله.


Content-Disposition

هذا عادةً لأن الموقع يرسل Content-Disposition رأس في الاستجابة. على وجه التحديد ، يمكن أن ترسل إما inline أو attachment.

inline هو الإعداد الافتراضي إذا لم يتم تحديده خلافًا لذلك ، ويعني أن المتصفح سيفتح الملف داخل نافذة المتصفح إذا كان قادرًا على ذلك.

attachment يعني تنزيل الملف دائمًا ، ولا تحاول مطلقًا فتحه داخل المتصفح.


إذا فتحت أدوات مطور برامج المتصفح ، فستشاهد رابطًا معينًا يرسل رؤوس الاستجابة التالية:

Content-Disposition: attachment; filename="Schubert-Sonata-21-B-flat.pdf"
Content-Type: application/pdf

هذا يخبر المتصفح ل دائما تحميل (attachment) الملف ، ولإعطائه اسم الملف الافتراضي ل Schubert-Sonata-21-B-flat.pdf بدلاً من استنتاجها من عنوان URL. بالإضافة إلى ذلك ، فإنه يخبر المتصفح (بشكل صحيح) أنه application/pdf ملف - ولكن بما انها attachment سيظل المستعرض الافتراضي للتنزيل.


تفاصيل مناولة مضمنة

عندما Content-Disposition مضمن (أو غير محدد) ، سيحاول المتصفح فتح الملف في العارض الافتراضي المضمن. هذا يعمل فقط عندما يعرف المتصفح نوع الملف الذي هو عليه ، و يعرف المتصفح كيفية فتح هذا النوع.

كشف النوع

يمكن تحديد نوع الملف بواسطة الخادم باستخدام Content-Type الرأس. على سبيل المثال ، الأنواع المضمنة الأكثر شيوعاً هي text/html، application/javascript و text/cssمكونة الأجزاء الثلاثة الرئيسية من موقع إلكتروني حديث. يمكنك أيضا الحصول على المزيد من الأنواع الباطنية مثل application/pdf.

احتمال آخر هو أن الخادم قد حدد Content-Type من application/octet-stream. هذا هو النوع الأكثر عمومية ، ويخبر المتصفح أن الملف مجرد بيانات عشوائية - وفي هذه الحالة ، الشيء الوحيد الذي يمكن للمتصفح فعله هو تنزيله (نظريا - سنصل إلى ذلك).

عندما Content-Typeلم يتم تحديده من قبل الخادم (وأحيانًا حتى عندما يكون) ، يمكن للمتصفح تنفيذ ما يعرف باسم استنشاق لمحاولة تخمين النوع عن طريق قراءة الملف والبحث عن الأنماط.

نوع التعامل

عند استلام ملف مع inline أو التصرف غير المحدد ، يحتاج المتصفح إلى محاولة فتحه في المتصفح إن أمكن. للقيام بذلك ، فإنه يبحث في نوع الملف ، وإذا تعرف على النوع فإنه سيحاول فتحه. معظم المتصفحات سوف تفتح أي text/ اكتب في عارض نص بسيط ، سيحاول تقديم text/html كصفحة ويب ، قد افتح application/json في عارض تركيب محدد بشكل خاص، وما إلى ذلك

نوع application/octet-stream تم التعامل مع خصيصا. نظرًا لأنه من المفترض أن يكون النوع الأكثر عمومية ، ويدل على تدفق عشوائي للبايت ، فلا يفترض أن يكون أي معالج يمكن تطبيقه على جميع ملفات هذا "النوع". على سبيل المثال ، في Firefox ، هذا يدل على عدم القدرة على تعيين المعالج الافتراضي إلى عن على application/octet-stream.

تستخدم بعض مواقع الويب أيضًا أنواعًا غير قياسية. رأيت application/force-download المستخدم - الذي ينتهي كتحميل لأن المتصفح لا يتعرف أو يعرف ما يفعله أيضًا بالنوع ، ولكنه لا يتمتع بالمعاملة الخاصة التي application/octet-stream هل.


قليلا من تاريخ الدرس

لمعرفة كيفية معالجة ملفات PDF ، يمكننا البحث قليلاً في سجل الويب. انظر ، في الماضي ، لم يكن لدى المتصفحات فكرة عن ملف PDF. لذلك لم يتمكنوا من فتحه. ولكننا رأينا أن ملفات PDF مفتوحة في المتصفحات قبل فترة طويلة من أن المشاهد المدمج في PDF كان أمرًا ما ، إذن كيف نجح ذلك؟

كان من الممكن أن يتم توسيع وظائف المستعرض بمزيد من التحكم عن ما يمكنك القيام به باستخدام إضافات / إضافات محدودة هذه الأيام. تلك كانت معروفة بشكل عام الإضافات. في Internet Explorer ، كانت عناصر تحكم ActiveX. في Mozilla Firefox ولاحقًا Google Chrome ، تم استخدام NPAPI الإضافات. كانت هذه الإضافات قادرة على القيام بكل شيء يمكن لأي برنامج آخر ، ويمكن أيضا تسجيل نفسها كمعالج لنوع معين من الملفات التي قد يكون غير متعرف عليها من قبل المتصفح. (بالمناسبة ، تم العثور على هذا لاحقا ليكون مخاطرة أمنية ضخمة وسقطت تدريجيا الدعم لهذه الإضافات القوية ...)

في أيام الإضافات ، ستذهب وتثبيت برنامج Adobe Acrobat Reader ، الذي سيقوم بعد ذلك بتثبيت ملحق ActiveX أو NPAPI الذي سيسجل application/pdf اكتب MIME وأخبر المتصفح بفتح هذه الأنواع المضمنة باستخدام المكون الإضافي.

وبالطبع ، بعد عدد من مشكلات الأمان والأداء التي تسببها هذه المكونات الإضافية ، قرر موردو المستعرضات الرئيسيون دمج مشاهدي PDF الخاصين بهم مع إلغاء الدعم لمعظم المكونات الإضافية. الشيء الوحيد الذي ما زلنا نراه هو Adobe Shockwave Flash ، الذي يتعامل معه application/x-shockwave-flash.

لا يزال هناك بالفعل بعض الضوابط المتبقية لهذا ، على سبيل المثال ، في فايرفوكس Preview in Firefox الخيار لا يزال موجودًا:

Screenshot of option

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

Screenshot of registered types

كانت تلك الأيام أيضًا قبل الكثير من الدعم الإعلامي الذي جاء مع HTML5. لم يكن مجرد ملفات PDF - متصفحك لن يكون لديه أي فكرة عن كيفية التعامل مع حاوية MP4 أو فيديو H.264 ، ولا توجد فكرة عن كيفية تشغيل ملف MP3 ، وما إلى ذلك ، ... ستشاهد الإضافات التي يوفرها مشغلات الوسائط مثل VLC أو حتى Windows Media Player ، أو مواقع الويب التي تتضمن مشغل وسائط مبنيًا في Flash.


139
2017-12-17 07:04



في بعض الأحيان يحدث ذلك أيضًا عند ضبط الخادم Content-Type: application/octet-stream لكن هذا أقل شيوعًا هذه الأيام. - Michael Hampton
السبب في استخدام قيم "inline" و "attachment" هو أن Content-Disposition تم تحديده في الأصل للبريد الإلكتروني MIME ، حيث تكون هذه القيم أكثر ملاءمة :) - hobbs
hobbs: ما يقرب من دراسة حالة في المصطلحات الخاصة بالمجال في التكنولوجيا القابلة لإعادة الاستخدام عندما يكون هناك شيء أكثر تجريدًا يفعل ^ _ ^ - Lightness Races in Orbit


لقد وجدت تفسيرا. وفقا ل الجواب وجدت، يبدو أن Chrome سيعمل على تنزيل ملف PDF إذا تم تعيين نوع محتوى MIME application/pdf بل "نوع MIME غير صحيح أو عام" ، application/octet-stream.

علاوة على ذلك"ترسل معظم خوادم الويب موارد من نوع غير معروف باستخدام الإعداد الافتراضي application/octet-stream نوع التمثيل الصامت. لأسباب تتعلق بالأمان ، لا تسمح معظم المتصفحات بتعيين إجراء افتراضي مخصص لمثل هذه الموارد ، مما يجبر المستخدم على تخزينه على القرص لاستخدامه. "


23
2017-12-17 07:05



في الواقع - يلغي هذا المنطق محتوى المحتوى ومن المهم بالتالي تذكره. - Lightness Races in Orbit
LightnessRacesinOrbit لا يوجد الكثير تجاوز التصرف لأنه يعطي المستعرض نوعًا لا يمكنه فعل أي شيء به (منع الاستنشاق) بخلاف الحفظ على القرص. منح ، التأثير المرئي هو نفسه. - Bob
Bob: حسنا نعم هذا هو تفسير عادل - Lightness Races in Orbit


هذا يرجع إلى HTTP Content-Disposition رأس تحديد أن الملف هو المرفق. هذا يرشد المتصفح لتنزيل الملف ، بدلاً من فتحه مباشرة.

هناك إضافة Chrome يمكنها تجاوز هذا السلوك. الصورة التالية مأخوذة من أدوات مطوري Firefox:

HTTP request as seen in the Firefox development tools


20
2017-12-17 07:05



هل لي أن أسأل ما إذا كان هناك أيضا إضافة فيرفكس مماثلة؟ - davyjones
davyjones يمكنك. حتى لا تضطر إلى الاستفسار عما إذا كان هناك إضافة فيرفكس ، هنا واحد هو. - wizzwizz4
يبدو أن هذا المكوِّن الإضافي لم يعد يعمل - Paul Slocum