ทำไมบางครั้ง Chrome ดาวน์โหลด PDF แทนที่จะเปิด [ซ้ำ]


125

เมื่อฉันไปยังที่อยู่บางอย่างของไฟล์ PDF Chrome จะดาวน์โหลด PDF แทนที่จะเปิดโดยใช้โปรแกรมดู PDF ในตัว หน้านั้นเป็นสีขาวที่ว่างเปล่า

ไม่มีปัญหากับการตั้งค่า Chrome ของฉัน: ฉันลองใช้ที่อยู่ของไฟล์ PDF อื่นและ Chrome ทำงานตามที่คาดไว้ (ฉันตั้งไว้ให้ใช้โปรแกรมดู PDF ในตัวของ Chrome) แต่ทุกครั้งที่ฉันลองใช้ที่อยู่ที่มีปัญหาเดียวกัน Chrome จะดาวน์โหลด PDF แล้วแสดงหน้าว่าง

ฉันกำลังใช้ Windows 10 และ Version 63.0.3239.84 (Official Build) (64-bit)Chrome

URL ปัญหาเฉพาะของฉันในเวลานี้อยู่ที่นี่ (ผลการค้นหาของ Google)

คำตอบ:


159

โดยทั่วไปสิ่งนี้เกิดขึ้นเพราะเว็บไซต์บอกให้เบราว์เซอร์ทำ บางครั้งอาจเป็นเพราะนักพัฒนาเว็บไซต์ตัดสินใจว่าพวกเขาต้องการพฤติกรรมนี้เช่นพบได้ทั่วไปในเว็บไซต์แบ่งปันไฟล์ บางครั้งอาจเป็นเพราะเป็นตัวเลือกเริ่มต้นสำหรับซอฟต์แวร์ใดก็ตามที่ใช้ (เช่นฟอรัมหรือซอฟต์แวร์บล็อก) บางครั้งมันเป็นเพราะเว็บไซต์ dev ไม่รู้ว่ากำลังทำอะไรอยู่


Content-Disposition

นั่นเป็นเพราะเว็บไซต์ส่งContent-Dispositionส่วนหัวในการตอบกลับ โดยเฉพาะมันสามารถส่งทั้งสองหรือinlineattachment

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เบราว์เซอร์จะยังคงเป็นค่าเริ่มต้นสำหรับการดาวน์โหลด


รายละเอียดการจัดการแบบอินไลน์

เมื่อ a 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 ในตัวเป็นสิ่งที่ใช้งานได้อย่างไร

เคยเป็นไปได้ที่จะขยายฟังก์ชั่นเบราว์เซอร์ที่มีการควบคุมมากกว่าสิ่งที่คุณสามารถทำได้ด้วยส่วนขยาย / addons จำกัด วันนี้ ผู้ที่เป็นที่รู้จักกันมากที่สุดโดยทั่วไปเป็นปลั๊กอิน ใน Internet Explorer พวกเขาเป็นตัวควบคุม ActiveX ใน Mozilla Firefox และ Google Chrome รุ่นต่อมาเป็นปลั๊กอินของ NPAPI ปลั๊กอินเหล่านี้มีความสามารถในการทำทุกอย่างที่โปรแกรมอื่นสามารถทำได้และสามารถลงทะเบียนตัวเองเป็นตัวจัดการสำหรับประเภทไฟล์ที่เฉพาะเจาะจงซึ่งเบราว์เซอร์อาจไม่รู้จักเป็นอย่างอื่น (โดยบังเอิญพบว่าภายหลังมีความเสี่ยงด้านความปลอดภัยสูงและการสนับสนุนปลั๊กอินที่ทรงพลังเหล่านี้ก็ค่อยๆลดลง ... )

ในวันของปลั๊กอินคุณจะไปและติดตั้ง Adobe Acrobat Reader ซึ่งจะติดตั้งปลั๊กอิน ActiveX หรือ NPAPI ที่จะลงทะเบียนapplication/pdfประเภท MIME และบอกเบราว์เซอร์เพื่อเปิดประเภทอินไลน์โดยใช้ปลั๊กอิน

แน่นอนหลังจากปัญหาด้านความปลอดภัยและประสิทธิภาพที่เกิดจากปลั๊กอินเหล่านี้ผู้ขายเบราว์เซอร์รายใหญ่ตัดสินใจรวมผู้ดู PDF ของพวกเขาเองในขณะที่ยุติการสนับสนุนปลั๊กอินส่วนใหญ่ สิ่งเดียวที่เรายังเห็นคือ Adobe Shockwave Flash ซึ่งจัดการapplication/x-shockwave-flashได้

ยังมีการควบคุมที่เหลืออยู่สำหรับเรื่องนี้เช่นใน Firefox Preview in Firefoxตัวเลือกยังคงมีอยู่:

ภาพหน้าจอของตัวเลือก

ในอดีตสิ่งนี้จะอนุญาตให้มีตัวเลือกระหว่างปลั๊กอินหลายตัวที่ลงทะเบียนประเภทนั้น ตัวอย่างเช่นรายการประเภทที่ลงทะเบียนสำหรับ Flash:

สกรีนช็อตของประเภทที่ลงทะเบียน

สมัยก่อนนั้นยังมีการสนับสนุนสื่อมากมายที่มาพร้อมกับ HTML5 มันไม่ได้เป็นเพียงไฟล์ PDF - เบราว์เซอร์ของคุณจะไม่รู้ว่าจะจัดการกับคอนเทนเนอร์ MP4 หรือวิดีโอ H.264 ได้อย่างไรไม่รู้ว่าจะเล่นไฟล์ MP3 ฯลฯ ได้อย่างไรคุณจะเห็นปลั๊กอินที่จัดทำโดยผู้เล่นสื่อเช่น VLC หรือแม้แต่ Windows Media Player หรือเว็บไซต์จะฝังเครื่องเล่นสื่อในตัวแฟลช


ในบางครั้งมันก็เกิดขึ้นเมื่อเซิร์ฟเวอร์ตั้งค่าContent-Type: application/octet-streamแต่วันนี้ไม่ค่อยพบบ่อย
Michael Hampton

2
เหตุผลที่ใช้ค่า "แบบอินไลน์" และ "สิ่งที่แนบมา" เป็นเพราะการระบุเนื้อหา - การจัดการสำหรับอีเมล MIME ซึ่งค่าเหล่านั้นมีความเหมาะสมมากกว่า :)
hobbs

@ ฮอบส์: เกือบจะเป็นกรณีศึกษาเกี่ยวกับคำศัพท์เฉพาะโดเมนในเทคโนโลยีที่นำมาใช้ซ้ำได้เมื่อมีสิ่งที่เป็นนามธรรมมากขึ้น ^ _ ^
Lightness Races ใน Orbit

23

ฉันพบคำอธิบาย ตามที่คำตอบที่ผมพบก็ปรากฏว่า Chrome จะดาวน์โหลดไฟล์ PDF ถ้าชนิดเนื้อหา MIME มีการตั้งค่าที่จะไม่application/pdfแต่เป็น "ประเภทไม่ถูกต้องหรือทั่วไป application/octet-streamMIME"

นอกจากนี้ "เว็บเซิร์ฟเวอร์ส่วนใหญ่ส่งทรัพยากรประเภทไม่รู้จักโดยใช้application/octet-streamประเภท MIME เริ่มต้นด้วยเหตุผลด้านความปลอดภัยเบราว์เซอร์ส่วนใหญ่ไม่อนุญาตให้ตั้งค่าการกระทำเริ่มต้นที่กำหนดเองสำหรับทรัพยากรดังกล่าวบังคับให้ผู้ใช้จัดเก็บลงดิสก์เพื่อใช้งาน"


3
แน่นอน - ตรรกะนี้แทนที่การจัดการเนื้อหาและจึงเป็นสิ่งสำคัญที่ต้องจำ
การแข่งขัน Lightness ใน Orbit

@LightnessRacesinOrbit มันไม่ได้แทนที่การจัดการมากนักเพราะมันทำให้เบราว์เซอร์เป็นประเภทที่ไม่สามารถทำอะไรได้เลย (ยกเว้นการดมกลิ่น) นอกเหนือจากการบันทึกลงดิสก์ ได้รับผลกระทบที่มองเห็นได้เหมือนกัน
Bob

@Bob: ใช่แล้วนั่นคือการตีความที่เป็นธรรม
Lightness Races ใน Orbit

20

นี่คือสาเหตุที่HTTP Content-Dispositionส่วนหัวระบุว่าไฟล์เป็นสิ่งที่แนบมา เป็นการสั่งให้เบราว์เซอร์ดาวน์โหลดไฟล์แทนที่จะเปิดโดยตรง

มีส่วนเสริมของ Chrome ที่สามารถแทนที่พฤติกรรมนี้ได้ ภาพต่อไปนี้มาจากเครื่องมือสำหรับนักพัฒนา Firefox:

คำขอ HTTP ดังที่เห็นในเครื่องมือพัฒนา Firefox


ฉันขอถามได้ไหมว่ามีโปรแกรมเสริม Firefox ที่คล้ายกันหรือไม่
davyjones

3
@davyjones คุณสามารถ เพื่อที่คุณจะได้ไม่ต้องถามว่ามีความเป็น Firefox add-on ที่นี่หนึ่งคือ
wizzwizz4

1
ปลั๊กอินนั้นไม่สามารถใช้งานได้อีกต่อไป
Paul Slocum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.