Ресурс интерпретируется как Документ, но передается с приложением MIME-типа / zip - PullRequest
171 голосов
/ 05 июля 2011

В Chrome 12.0.742.112, если я перенаправляю со следующими заголовками:

HTTP/1.1 302 Found 
Location: http://0.0.0.0:3000/files/download.zip
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
X-Ua-Compatible: IE=Edge
X-Runtime: 0.157964
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:42:25 GMT
Connection: Keep-Alive

, который при последующем возвращает следующий заголовок:

HTTP/1.1 200 OK 
Last-Modified: Tue, 05 Jul 2011 18:18:30 GMT
Content-Type: application/zip
Content-Length: 150014
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 05 Jul 2011 18:44:47 GMT
Connection: Keep-Alive

Chrome не будет ни перенаправлять, ни изменятьНа предыдущей странице в консоли будет отображаться следующее предупреждение:

Ресурс интерпретируется как Документ, но передается с приложением MIME-типа / zip.

Процесс работаетправильно в Firefox, а также отлично работает в Chrome, если я открою новую вкладку и сразу перейду к http://0.0.0.0:3000/files/download.zip.Я делаю что-то не так, или это ошибка / изюминка Chrome?

Ответы [ 14 ]

155 голосов
/ 03 июля 2013

Вы можете указать атрибут HTML5 download в своем теге .

<a href="http://example.com/archive.zip" download>Export</a>

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

32 голосов
/ 05 июля 2011

В заголовке вашего запроса вы отправили Content-Type: text/html, что означает, что вы хотите интерпретировать ответ как HTML.Теперь, даже если сервер отправляет вам файлы PDF, ваш браузер пытается понять его как HTML.Это проблема.Я ищу, чтобы узнать причину.:)

24 голосов
/ 02 октября 2015

Я столкнулся с этой проблемой при обслуживании файла PDF (MIME-тип application / pdf) и решил ее, установив заголовок Content-Disposition, например:

Content-Disposition: attachment; filename=foo.pdf

Надеюсь, это поможет.

21 голосов
/ 05 июля 2011

Я исправил это ... просто открыв новую вкладку.

Почему это не работает, я не совсем уверен, но это может иметь какое-то отношение к тому, как Chrome обрабатывает множественные загрузки на странице, возможно, он думал, что они были спамом, и просто игнорировал их.

18 голосов
/ 30 сентября 2016

Я нигде не смог найти только объяснение сообщения само по себе. Вот моя интерпретация.

Насколько я понимаю, Chrome ожидал некоторый материал, который он мог бы отобразить ( документ ), но он получил что-то, что не смог отобразить (или что ему было сказано не отображать).

Это вопрос как того, как документ был объявлен на уровне HTML-страницы в href (см. Атрибут download в сообщении Роя), так и того, как он был объявлен в ответе сервера с помощью заголовков HTTP ( в частности Content-Disposition). Это вопрос контракта , в отличие от надежды и ожидания.

Чтобы продолжить путь Эвана, я испытал это:

Content-type: application/pdf
Content-disposition: attachment; filename=some.pdf

является просто несовместимым с:

<a href='some.pdf'>

Chrome будет плакать Ресурс интерпретируется как документ, но передается…

На самом деле расположение вложения просто означает это: браузер не должен интерпретировать ссылку, а должен хранить ее где-то для других - скрытых - целей. Здесь выше, либо download отсутствует рядом с href, либо Content-disposition необходимо удалить из заголовков. Это зависит от того, хотим ли мы, чтобы браузер отображал документ или нет.

Надеюсь, это поможет.

8 голосов
/ 10 октября 2013

Я столкнулся с такой же проблемой сегодня в Chrome версии 30.0.1599.66 с моим приложением node.js / express.js.

Заголовки верны , экспресс-правильно их устанавливает,работает в других браузерах, как указано, использование html 5 атрибута download не разрешает, что did разрешает, это происходит в расширенных настройках chrome и ставит флажок «Спросить, где сохранить каждый файл перед загрузкой».

После этого не было сообщения об ошибке «Ресурс интерпретирован как документ ....», как в названии этой проблемы, поэтому кажется, что наш код сервера правильный, это Chrome, которыйнеправильно сообщает об этой ошибке в консоли, когда она настроена на автоматическое сохранение файлов в папку.

6 голосов
/ 17 января 2019

У меня была похожая проблема при выполнении загрузки файла через Javascript.Добавление атрибута загрузки не имело значения, но добавление target = '_ blank' не помогло - я больше не получаю консольное сообщение 'Resource интерпретируется как Document ...'.

Вот мой довольно простой код:

var link = document.createElement('a');
link.target = '_blank';
link.href = url;
document.body.appendChild(link); // Required for Firefox
link.click();
link.remove(); 

Я не пробовал использовать прямой HTML, но ожидал, что он будет работать.

Обратите внимание, я обнаружил, что Firefox требует, чтобы ссылка добавлялась в документ, тогда как Chrome будет работать без нее.

4 голосов
/ 09 июня 2014

Я столкнулся с этим, когда я назначил src = "image_url" в iframe. Кажется, что iframe интерпретирует это как документ, но это не так. Вот почему отображается предупреждение.

2 голосов
/ 30 сентября 2016

У меня была эта проблема в проекте веб-сайта ASP.Добавление заголовка «Content-Length» привело к тому, что загрузки снова начали работать в Chrome.

1 голос
/ 06 ноября 2017

Эта проблема вновь появилась в версии Chrome 61.Но похоже, что это исправлено в Chrome 62.

У меня есть RewriteRule, как показано ниже

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA]

С Chrome 61 PDF не открывался, в консоли показывалось сообщение

"Resource interpreted as Document but transferred with MIME type application/pdf: "

Мы попытались добавить тип mime в правило перезаписи, как показано ниже, но это не помогло.

RewriteRule ^/ShowGuide/?$ https://<website>/help.pdf [L,NC,R,QSA, t:application/pdf]

Я обновил Chrome до последней версии 62, и он начал показыватьСнова PDF.Но сообщение все еще есть в консоли.

Со всеми другими браузерами оно было / работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...