Chrome neden açmak yerine bir PDF dosyasını indiriyor? [çift]


125

PDF dosyalarının belirli adreslerine gittiğimde, Chrome, PDF dosyasını yerleşik PDF görüntüleyicisini kullanarak açmak yerine PDF'ye indirir. Sayfa daha sonra boş beyazdır.

Chrome ayarlarımda sorun yok: Diğer PDF dosyalarının adreslerini deniyorum ve Chrome beklendiği gibi davranıyor (Chrome'un yerleşik PDF görüntüleyicisini kullanacak şekilde ayarlamıştım). Ancak aynı sorunlu adresi her denediğimde, Chrome PDF'yi indirir ve ardından boş bir sayfa görüntüler.

Windows 10 ve Chrome kullanıyorum Version 63.0.3239.84 (Official Build) (64-bit).

Özel sorunlu URL’m bu sefer burada (bir Google arama sonucu).

Yanıtlar:


159

Temel olarak, bu, web sitesine tarayıcıya bunu yapmasını söylemesi nedeniyle olur. Bazen, web sitesi geliştiricisinin bu davranışı istediğine karar vermesi nedeniyle, örneğin dosya paylaşım sitelerinde yaygındır. Diğer zamanlarda, kullandıkları yazılım için varsayılan bir seçenek olması nedeniyle (örneğin forum veya blog yazılımı). Bazen bunun nedeni site dev'in ne yaptıkları hakkında hiçbir fikrinin olmamasıdır.


Content-Disposition

Bunun nedeni genellikle sitenin Content-Dispositionyanıtta bir başlık göndermesidir . Özellikle, ya inlineda gönderebilir attachment.

inline Aksi belirtilmedikçe, varsayılan değerdir ve tarayıcının mümkün olması durumunda dosyayı tarayıcı penceresinde açacağı anlamına gelir.

attachment dosyayı her zaman indirmek anlamına gelir, asla tarayıcının içinde açmaya çalışmayın.


Tarayıcınızın geliştirici araçlarını açarsanız, belirli bir bağlantının aşağıdaki yanıt başlıklarını gönderdiğini göreceksiniz:

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

Bu, tarayıcıya dosyayı her zaman indirmesini ( attachment) Schubert-Sonata-21-B-flat.pdfve URL'den çıkarmaktansa varsayılan dosya adını vermesini söyler . Ek olarak, tarayıcıya (doğru şekilde) bir application/pdfdosya olduğunu söyler - ancak attachmenttarayıcı olduğundan indirmeye devam etmek yine de varsayılandır.


Satır içi işleme ayrıntıları

A Content-Dispositionsatır içi (veya belirtilmemiş) olduğunda, tarayıcı dosyayı varsayılan gömülü görüntüleyicide açmaya çalışır. Tarayıcı ne dosya türü bilir, bu sadece çalışır ve tarayıcı türünü açan bilir.

Tip algılama

Dosya türü sunucu tarafından bir Content-Typebaşlık ile belirtilebilir . Örneğin, en yaygın satır içi türleridir text/html, application/javascriptve text/cssmodern bir web sitesinin üç ana bölümden oluşturan,. Gibi daha ezoterik türleri de olabilir application/pdf.

Başka bir olasılık, sunucunun bir belirtmiş Content-Typeolmasıdır application/octet-stream. Bu en genel türdür ve tarayıcıya dosyanın yalnızca rastgele veriler olduğunu söyler - bu noktada tarayıcının yapabileceği tek şey onu indirmek olduğunu (teoride - buna ulaşacağız).

A Content-Typesunucu tarafından belirtilmediğinde (ve bazen de olsa), tarayıcı , dosyayı okuyarak ve kalıpları arayarak türü tahmin etmeye çalışmak için koklama olarak bilinen şeyi yapabilir .

Türü işleme

Belirlenmemiş inlineveya belirtilmemiş bir dosyaya sahip bir dosyayı aldıktan sonra , tarayıcının mümkünse tarayıcıda açmayı denemesi gerekir. Bunu yapmak için, dosya türüne bakar ve türü tanırsa açmaya çalışır. Çoğu tarayıcı text/basit bir metin görüntüleyicide herhangi bir tür açacak , text/htmlweb sayfası olarak oluşturmaya çalışacak , özel bir sözdizimi vurgulanmış görüntüleyicide açabilirapplication/json .

Tip application/octet-streamözel olarak ele alındı. Rastgele bir bayt akışını ifade eden en genel tür olması gerektiği için, bu "tür" deki tüm dosyalara uygulanabilecek herhangi bir işleyici olması gerekmiyordu. Örneğin, Firefox'ta, bu varsayılan işleyicisi ayarlamak için bir yetersizlik olarak tezahür için application/octet-stream.

Bazı web siteleri de standart olmayan türler kullanmıştır. application/force-downloadKullanıldığını gördüm - bu bir indirme olarak sona eriyor, çünkü tarayıcı bu türle başka ne yapabileceğini tanımıyor veya bilmiyor, ancak özel işlemlerden hoşlanmıyor application/octet-stream.


Biraz tarih dersi

PDF'lerin nasıl işlendiğini görmek için, biraz web geçmişine girebiliriz. Geçmişte, tarayıcıların PDF'nin ne olduğu hakkında hiçbir fikri yoktu. Böylece açamadılar. Ancak PDF'lerin yerleşik PDF görüntüleyicileri bir şey olmadan çok önce tarayıcılarda açıldığını gördük, peki bu nasıl oldu?

Tarayıcı işlevini, bugünlerde sınırlı sayıda / eklenti ile yapabileceklerinizden çok daha fazla kontrolle genişletmek mümkün olmuştu. Bunlar en genel olarak eklentiler olarak biliniyordu . Internet Explorer’da ActiveX denetimleriydi; Mozilla Firefox’ta ve daha sonra Google Chrome’da NPAPI eklentileriydi. Bu eklentiler, başka bir programın yapabileceği her şeyi yapabilir ve ayrıca tarayıcı tarafından başka şekilde tanınamayacak belirli bir dosya türü için kendilerini işleyici olarak kaydedebilir. (Bu arada, bunun daha sonra büyük bir güvenlik riski olduğu bulundu ve bu güçlü eklentilere verilen destek yavaş yavaş düştü ...)

Eklenti günlerinde gidip Adobe Acrobat Reader'ı yükleyecektikten sonra application/pdfMIME türünü kaydeden bir ActiveX veya NPAPI eklentisi yükler ve tarayıcıya eklentiyi kullanarak bu satır içi satırları açmasını söylersiniz.

Elbette, bu eklentilerin neden olduğu bir dizi güvenlik ve performans sorunundan sonra, büyük tarayıcı satıcıları çoğu eklentiyi desteklerken, kendi PDF görüntüleyicilerini de kullanmaya karar verdi. Hala gördüğümüz tek şey, işleyen Adobe Shockwave Flash application/x-shockwave-flash.

Aslında bunun için bazı artık kontroller var, örneğin Firefox'ta Preview in Firefoxseçenek hala var:

Seçeneğin ekran görüntüsü

Geçmişte, bu, bu türü kaydeden birden fazla eklenti arasında seçim yapılmasını sağlardı. Örneğin, Flash için kayıtlı türlerin listesi:

Kayıtlı türlerin ekran görüntüsü

O günler ayrıca HTML5 ile birlikte gelen birçok medya desteğinden önceydi. Sadece PDF'ler değildi - tarayıcınız MP4 konteyneri veya H.264 videoyu nasıl kullanacağını, MP3 dosyasını nasıl çalacağını hiçbir fikrini bilmiyordu vb. hatta Windows Media Player veya web siteleri, Flash'ta yerleşik bir medya oynatıcısını yerleştirebilir.


Bazen de sunucu ayarlandığında gerçekleşir Content-Type: application/octet-streamancak bu günlerde çok daha az yaygındır.
Michael Hampton,

2
İçerik Eğilimi aslen MIME bu değerler :) bir sürü daha uygundur e-posta, belirtilmemiş olduğundan değerler "inline" ve "eki" da kullanılmasının nedeni ise
hobbs

@hobbs: Neredeyse yeniden kullanılabilir teknolojide etki alanına özgü terminolojide bir durum çalışması daha soyut bir şey yapacağı zaman ^ _ ^
Orbit'teki Hafiflik Yarışları

23

Bir açıklama buldum. Bulduğum bir cevaba göre , MIME içerik türü application/pdfdeğil, "yanlış veya genel MIME türü" olarak ayarlanmışsa Chrome'un bir PDF indireceği anlaşılıyor application/octet-stream.

Ayrıca , "Çoğu web sunucusu, varsayılan application/octet-streamMIME türünü kullanarak bilinmeyen türden kaynaklar gönderir . Güvenlik nedeniyle, çoğu tarayıcı, bu tür kaynaklar için kullanıcıyı özel bir varsayılan eylem ayarlamaya izin vermez, bu da kullanıcıyı diski kullanmaya zorlar."


3
Nitekim - bu mantık içeriğin düzenini geçersiz kılar ve bu nedenle hatırlanması önemlidir.
Orbit'teki Hafiflik Yarışları

@LightnessRacesinOrbit Tarayıcıya, diske kaydetmekten başka hiçbir şey yapamayacağı bir tür (vermeyi engelleme) yapması nedeniyle, konumlandırmayı geçersiz kılmaz . Verilmiş, görünür etki aynıdır.
Bob

@Bob: Tamam, bu adil bir yorum
Orbit'teki Hafiflik Yarışları

20

Bu, dosyanın bir ek olduğunu belirten HTTP Content-Dispositionbaşlığından kaynaklanmaktadır . Bu, tarayıcıya dosyayı doğrudan açmak yerine dosyayı indirmesini söyler.

Bu davranışı geçersiz kılabilecek bir Chrome eklentisi var. Aşağıdaki resim Firefox geliştirici araçlarından alınmıştır:

Firefox geliştirme araçlarında görüldüğü gibi HTTP isteği


Benzer bir Firefox eklentisi olup olmadığını sorabilir miyim?
davyjones

3
@davyjones Olabilir. Böylece bir Firefox eklentisi olup olmadığını sormanıza gerek kalmaz, işte bir tanesi.
wizzwizz4

1
Bu eklenti artık işe yaramadı
Paul Slocum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.