114

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

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

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

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

3 ответа3

142

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


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, который бы регистрировал MIME-тип application/pdf и велел браузеру открывать эти типы встроенным с помощью плагина.

Конечно, после ряда проблем с безопасностью и производительностью, вызванных этими плагинами, основные поставщики браузеров решили включить свои собственные средства просмотра PDF, одновременно прекратив поддержку большинства плагинов. Единственное, что мы все еще видим, это Adobe Shockwave Flash, который обрабатывает application/x-shockwave-flash .

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

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

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

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

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

23

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

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

20

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .