Почему Chrome иногда загружает PDF вместо того, чтобы открывать его? [Дубликат]


125

Когда я перехожу к определенным адресам файлов PDF, Chrome загружает PDF вместо того, чтобы открывать его с помощью встроенного средства просмотра PDF. Страница становится пустой белой.

У меня нет проблем с настройками Chrome: я пробую адреса других файлов PDF, и Chrome ведет себя как положено (у меня настроено использование встроенной программы просмотра Chrome PDF). Но каждый раз, когда я пробую один и тот же проблемный адрес, Chrome загружает PDF, а затем отображает пустую страницу.

Я использую Windows 10 и Chrome Version 63.0.3239.84 (Official Build) (64-bit).

Мой конкретный проблемный URL на этот раз здесь (результат поиска Google).

Ответы:


159

По сути, это происходит потому, что веб-сайт говорит браузеру сделать это. Иногда это происходит потому, что разработчик веб-сайта решает, что им нужно такое поведение, например, распространенное на сайтах для обмена файлами. В других случаях это потому, что это вариант по умолчанию для любого программного обеспечения, которое они используют (например, программное обеспечение для форумов или блогов). Иногда это происходит потому, что разработчик сайта понятия не имеет, что они делают.


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браузер, загрузка по умолчанию все равно будет выполняться.


Встроенные детали обработки

Если a Content-Dispositionвстроено (или не указано), браузер попытается открыть файл во встроенной программе просмотра по умолчанию. Это работает только тогда, когда браузер знает, какой это тип файла, и браузер знает, как открыть этот тип.

Тип обнаружения

Тип файла может быть указан сервером с Content-Typeзаголовком. Например, наиболее распространенные встроенные типы text/html, application/javascriptи text/css, составляя три основные части современного сайта. Вы также можете иметь более эзотерические типы, как application/pdf.

Другая возможность заключается в том, как сервер указан Content-Typeв application/octet-stream. Это наиболее общий тип, и он сообщает браузеру, что файл - это просто произвольные данные - в этот момент единственное, что может сделать браузер, - это загрузить его (теоретически - мы доберемся до этого).

Когда Content-Typeсервер не указывает a (а иногда даже когда он есть), браузер может выполнить то, что известно как сниффинг, чтобы попытаться угадать тип, читая файл и ища шаблоны.

Тип обработки

После получения файла с 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.

На самом деле для этого еще есть некоторые элементы управления, например, в Firefox Preview in Firefoxопция все еще существует:

Скриншот варианта

В прошлом это позволяло выбирать между несколькими плагинами, которые зарегистрировали этот тип. Например, список зарегистрированных типов для Flash:

Скриншот зарегистрированных типов

Эти дни были и до того, как большая поддержка СМИ пришла с HTML5. Это были не просто PDF-файлы - ваш браузер не знал бы, как работать с контейнером MP4 или видео H.264, не знал бы, как воспроизводить MP3-файлы и т. Д. И т. Д. или даже Windows Media Player, или на веб-сайтах будет встроен медиаплеер, встроенный во Flash.


Иногда это также происходит, когда сервер устанавливает, Content-Type: application/octet-streamно это гораздо реже в наши дни.
Майкл Хэмптон

2
Причина, по которой используются значения «inline» и «attachment», заключается в том, что Content-Disposition изначально был указан для электронной почты MIME, где эти значения намного более уместны :)
hobbs

@hobbs: Практически конкретный пример предметно-ориентированной терминологии в технологии многократного использования, когда подойдет что-то более абстрактное ^ _ ^
Гонки

23

Я нашел объяснение. Согласно полученному ответу , похоже, что Chrome загрузит PDF-файл, если для типа содержимого MIME задан не application/pdfтип «MIME», а «неправильный или общий» application/octet-stream.

Кроме того , «большинство веб-серверов отправляют ресурсы неизвестного типа, используя application/octet-streamтип MIME по умолчанию . Из соображений безопасности большинство браузеров не разрешают устанавливать настраиваемое действие по умолчанию для таких ресурсов, вынуждая пользователя сохранять его на диске для его использования».


3
Действительно - эта логика переопределяет расположение контента и поэтому важно помнить.
Гонки

@LightnessRacesinOrbit Он не столько переопределяет расположение, сколько дает браузеру тип, с которым он ничего не может сделать (кроме сниффинга), кроме сохранения на диск. Конечно, видимый эффект тот же.
Боб

@Bob: Хорошо, да, это справедливая интерпретация
Гонки

20

Это связано с тем, что заголовок HTTPContent-Disposition указывает, что файл является вложением . Это указывает браузеру загружать файл, а не открывать его напрямую.

Существует дополнение для Chrome, которое может переопределить это поведение. Следующее изображение взято из инструментов разработчика Firefox:

HTTP-запрос, как видно из инструментов разработки Firefox


Могу я спросить, есть ли аналогичное дополнение для Firefox?
Дэвиджонс

3
@davyjones Вы можете. Чтобы вам не нужно было спрашивать, есть ли надстройка Firefox, вот она.
wizzwizz4

1
Этот плагин больше не работает
Paul Slocum
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.