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


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

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

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

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


106
2017-12-17 07:00


Источник




Ответы:


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


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

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

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

Screenshot of option

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

Screenshot of registered types

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


135
2017-12-17 07:04



Иногда это также происходит, когда сервер устанавливает Content-Type: application/octet-stream но в наши дни это намного менее распространено. - Michael Hampton
Причина, по которой используются значения «встроенные» и «вложения», заключается в том, что Content-Disposition изначально была указана для электронной почты MIME, где эти значения намного более уместны :) - hobbs
@hobbs: Практически в тематическом исследовании терминологии, специфичной для домена, в технологии многократного использования, когда что-то более абстрактное будет делать ^ _ ^ - Lightness Races in Orbit


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

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


23
2017-12-17 07:05



Действительно - эта логика переопределяет содержание и поэтому важно запомнить. - Lightness Races in Orbit
@LightnessRacesinOrbit Это не так много переопределение расположение, поскольку оно дает браузеру тип, с которым он ничего не может сделать (запрет нюхания), кроме сохранения на диск. Конечно, видимый эффект тот же. - Bob
@Bob: Хорошо, да, это справедливое толкование - Lightness Races in Orbit


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

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

HTTP request as seen in the Firefox development tools


19
2017-12-17 07:05



Могу ли я спросить, есть ли подобное дополнение Firefox? - davyjones
@davyjones Вы можете. Так что вам не нужно спрашивать, есть ли надстройка Firefox, Вот один. - wizzwizz4
Этот плагин больше не работает - Paul Slocum