Dlaczego Chrome czasami pobiera plik PDF zamiast go otwierać? [duplikować]

125

Kiedy przechodzę do niektórych adresów plików PDF, Chrome pobiera plik PDF zamiast otwierać go za pomocą wbudowanej przeglądarki plików PDF. Strona jest wówczas pusta na biało.

Nie mam problemu z moimi ustawieniami przeglądarki Chrome: próbuję adresów innych plików PDF, a Chrome zachowuje się zgodnie z oczekiwaniami (mam skonfigurowane korzystanie z wbudowanej przeglądarki plików PDF przeglądarki Chrome). Ale za każdym razem, gdy próbuję użyć tego samego problematycznego adresu, Chrome pobiera plik PDF, a następnie wyświetla pustą stronę.

Używam Windows 10 i Chrome Version 63.0.3239.84 (Official Build) (64-bit).

Mój specyficzny problematyczny adres URL tym razem jest tutaj (wynik wyszukiwania Google).

Rgrthat
źródło

Odpowiedzi:

159

Zasadniczo dzieje się tak, ponieważ witryna nakazuje przeglądarce to zrobić. Czasami dzieje się tak, ponieważ twórca witryny decyduje się na to zachowanie, np. Często spotykane w witrynach do udostępniania plików. Innym razem dzieje się tak, ponieważ jest to domyślna opcja dla dowolnego oprogramowania, którego używają (np. Forum lub oprogramowanie do blogowania). Czasami dzieje się tak, ponieważ twórca serwisu nie ma pojęcia, co robią.


Content-Disposition

Dzieje się tak zwykle dlatego, że witryna wysyła Content-Dispositionnagłówek w odpowiedzi. W szczególności, może wysłać albo inlinealbo attachment.

inline jest ustawieniem domyślnym, jeśli nie określono inaczej, i oznacza, że ​​przeglądarka otworzy plik w oknie przeglądarki, jeśli jest w stanie.

attachment oznacza zawsze pobieranie pliku, nigdy nie próbuj otwierać go w przeglądarce.


Jeśli otworzysz narzędzia programistyczne przeglądarki, zobaczysz, że dany link wysyła następujące nagłówki odpowiedzi:

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

Informuje to przeglądarkę, aby zawsze pobierała ( attachment) plik i nadawała mu domyślną nazwę pliku, Schubert-Sonata-21-B-flat.pdfzamiast wnioskować na podstawie adresu URL. Dodatkowo informuje przeglądarkę (poprawnie), że jest to application/pdfplik - ale ponieważ jest to attachmentprzeglądarka, nadal domyślnie pobiera.


Szczegółowe informacje dotyczące obsługi

Gdy a Content-Dispositionjest wbudowany (lub nieokreślony), przeglądarka spróbuje otworzyć plik w domyślnej przeglądarce osadzonej. Działa to tylko wtedy, gdy przeglądarka wie, jaki to typ pliku, a przeglądarka wie, jak otworzyć ten typ.

Wykrywanie typu

Typ pliku może być określony przez serwer za pomocą Content-Typenagłówka. Na przykład, najczęstsze typy wbudowane są text/html, application/javascripti text/css, składających się na trzy główne części nowoczesnej strony internetowej. Możesz także mieć więcej typów ezoterycznych application/pdf.

Inną możliwością jest serwer określił Content-Typez application/octet-stream. Jest to najbardziej ogólny typ, który informuje przeglądarkę, że plik to tylko dowolne dane - w tym momencie jedyną rzeczą, jaką może zrobić przeglądarka, jest jego pobranie (teoretycznie - przejdziemy do tego).

Jeśli a Content-Typenie jest określone przez serwer (a czasem nawet gdy tak jest), przeglądarka może wykonać tak zwane wąchanie, aby spróbować odgadnąć typ, czytając plik i szukając wzorców.

Obsługa typów

Po otrzymaniu pliku o inlinenieokreślonej dyspozycji przeglądarka musi spróbować otworzyć go w przeglądarce, jeśli to możliwe. Aby to zrobić, sprawdza typ pliku, a jeśli rozpozna typ, spróbuje go otworzyć. Większość przeglądarek otworzy dowolny text/typ w prostej przeglądarce tekstu, spróbuje renderować text/htmljako stronę internetową, może otworzyć się application/jsonw specjalnej przeglądarce wyróżnionej składnią itp.

Ten typ application/octet-streambył obsługiwany specjalnie. Ponieważ ma to być najbardziej ogólny typ, oznaczający dowolny strumień bajtów, nie powinien istnieć żaden program obsługi, który mógłby zastosować się do wszystkich plików tego „typu”. Przykładowo, w Firefoksie, to manifestuje się jako niezdolność do ustawienia domyślnego programu obsługi dla application/octet-stream.

Niektóre witryny wykorzystywały również niestandardowe typy. Widziałem application/force-downloadużywane - co kończy się pobraniem, ponieważ przeglądarka nie rozpoznaje lub nie wie, co zrobić z tym typem, ale nie cieszy się specjalną obsługą, application/octet-streamktóra to robi.


Trochę lekcji historii

Aby zobaczyć, jak obsługiwane są pliki PDF, możemy zagłębić się w historię online. Zobacz, w przeszłości przeglądarki nie miały pojęcia, co to jest plik PDF. Więc nie mogli go otworzyć. Ale widzieliśmy, że pliki PDF są otwierane w przeglądarkach na długo przedtem, zanim wbudowane przeglądarki plików PDF stały się rzeczą, więc jak to działało?

Kiedyś można było rozszerzyć funkcjonalność przeglądarki o znacznie większą kontrolę niż to, co można zrobić z ograniczonymi rozszerzeniami / dodatkami w dzisiejszych czasach. Najczęściej były one znane jako wtyczki . W Internet Explorerze były to formanty ActiveX; w Mozilla Firefox i później Google Chrome były to wtyczki NPAPI. Wtyczki te były w stanie zrobić wszystko, co mógł zrobić każdy inny program, a dodatkowo mogły zarejestrować się jako program obsługi określonego typu pliku, który w przeciwnym razie mógłby nie zostać rozpoznany przez przeglądarkę. (Nawiasem mówiąc, okazało się to później ogromnym zagrożeniem bezpieczeństwa, a wsparcie dla tych potężnych wtyczek było stopniowo odrzucane ...)

W czasach wtyczek instalowałeś program Adobe Acrobat Reader, który następnie instalowałby wtyczkę ActiveX lub NPAPI, która rejestrowałaby application/pdftyp MIME i kazała przeglądarce otwierać te typy bezpośrednio za pomocą wtyczki.

Oczywiście, po wielu problemach z bezpieczeństwem i wydajnością spowodowanych przez te wtyczki, główni dostawcy przeglądarek postanowili włączyć własne przeglądarki plików PDF, jednocześnie wycofując obsługę większości wtyczek. Jedynym, który wciąż widzimy, jest Adobe Shockwave Flash, który obsługuje application/x-shockwave-flash.

W rzeczywistości nadal istnieją pewne resztkowe elementy sterujące, np. W przeglądarce Firefox Preview in Firefoxopcja nadal istnieje:

Zrzut ekranu opcji

W przeszłości umożliwiałoby to wybór między wieloma wtyczkami, które zarejestrowały ten typ. Na przykład lista zarejestrowanych typów Flasha:

Zrzut ekranu zarejestrowanych typów

Te dni upłynęły także przed dużą ilością wsparcia medialnego z HTML5. To nie były tylko pliki PDF - Twoja przeglądarka nie miałaby pojęcia, jak obsługiwać kontener MP4 lub wideo H.264, nie miała pojęcia, jak odtwarzać plik MP3 itp. Itp. Zobaczyłbyś wtyczki dostarczane przez odtwarzacze multimedialne, takie jak VLC lub nawet Windows Media Player, lub strony internetowe osadziłyby odtwarzacz multimedialny wbudowany we Flash.

Kok
źródło
Czasami zdarza się to również wtedy, gdy serwer się ustawia, Content-Type: application/octet-streamale obecnie jest to znacznie mniej powszechne.
Michael Hampton
2
Powodem, dla którego używane są wartości „inline” i „załącznik”, jest to, że pierwotnie określono Content-Disposition dla wiadomości e-mail MIME, gdzie te wartości są o wiele bardziej odpowiednie :)
hobbs
@ Hobbs: Prawie studium przypadku w terminologii specyficznej dla dziedziny w technologii wielokrotnego użytku, gdy zrobi coś bardziej abstrakcyjnego ^ _ ^
Wyścigi lekkości na orbicie
23

Znalazłem wyjaśnienie. Według jednej odpowiedzi znalazłem , wydaje się, że Chrome będzie pobrać plik PDF, jeśli typ zawartości MIME jest ustawiony, aby nie application/pdfale raczej „nieprawidłowy lub ogólny typ MIME” application/octet-stream.

Ponadto „Większość serwerów WWW wysyła zasoby nieznanego typu przy użyciu domyślnego application/octet-streamtypu MIME. Ze względów bezpieczeństwa większość przeglądarek nie zezwala na ustawienie niestandardowej domyślnej akcji dla takich zasobów, zmuszając użytkownika do zapisania jej na dysku, aby z niej skorzystać”.

Rgrthat
źródło
3
Rzeczywiście - ta logika zastępuje usposobienie treści i dlatego należy o tym pamiętać.
Wyścigi lekkości na orbicie
@LightnessRacesinOrbit To nie tyle zastąpić dyspozycję, ponieważ daje przeglądarce typ nie może nic z (wyjąwszy wąchania) inne niż zapisać na dysku zrobić. To prawda, że ​​widoczny efekt jest taki sam.
Bob
@ Bob: Dobra tak, to uczciwa interpretacja
wyścigi lekkości na orbicie
20

Wynika to z nagłówka HTTPContent-Disposition określającego, że plik jest załącznikiem . To instruuje przeglądarkę, aby pobrać plik, zamiast otwierać go bezpośrednio.

Istnieje dodatek do przeglądarki Chrome, który może zastąpić to zachowanie. Poniższy obraz pochodzi z narzędzi programistycznych Firefox:

Żądanie HTTP widoczne w narzędziach programistycznych Firefox

bwDraco
źródło
Czy mogę zapytać, czy istnieje podobny dodatek do przeglądarki Firefox?
davyjones
3
@davyjones You may. Abyś nie musiał pytać, czy istnieje dodatek do przeglądarki Firefox, oto jeden z nich.
wizzwizz4
1
Ta wtyczka wydaje się już nie działać
Paul Slocum