Ресурс, интерпретируемый как Документ, но переносимый с помощью MIME-типа application/zip

С 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. Я что-то делаю неправильно, или это ошибка /quirk из Chrome?

Ответ 1

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

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

Ответ 3

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

Ответ 4

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

Content-Disposition: attachment; filename=foo.pdf

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

Ответ 5

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

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

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

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

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

просто несовместимо с:

<a href='some.pdf'>

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

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

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

Ответ 6

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

Заголовки правильные, экспресс устанавливает их правильно автоматически, он работает в других браузерах, как указано, помещая атрибут html 5 'download', не разрешает, что он разрешил, он переходит в расширенные настройки Chrome и проверяет флажок "Ask где сохранить каждый файл перед загрузкой".

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

Ответ 7

У меня была похожая проблема при выполнении загрузки файла через 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 будет работать без нее.

Ответ 8

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

Ответ 9

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

Ответ 10

Я получил эту ошибку, потому что я работал с моей файловой системой. Как только я начал с http-сервера, хром мог понять это.

Ответ 11

Эта проблема снова появилась в версии 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. Но сообщение все еще присутствует в консоли.

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

Ответ 12

В моем случае имя файла было слишком длинным и получило ту же ошибку. После сокращения ниже 200 символов работал нормально. (ограничение может быть 250?)

Ответ 13

У меня возникли те же проблемы с менеджером загрузки, который я создал. Проблема, связанная с тем, что имя файла было слишком длинным, а расширение было отключено.

Пример: Имя файла: организационные протоколы и другие важные моменты .pd

<?php
  header("Content-Disposition: attachment; filename=$File_Name");
?>

Решение. Увеличьте поле базы данных MySQL до 255, чтобы сохранить имя файла, и выполнили проверку длины перед сохранением blob. Если длинa > 255 обрезать до 250 и добавить расширение файла.

Ответ 14

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

Ответ 15

Я решил проблему, adding target="_blank" к ссылке. Таким образом, Chrome открывает новую вкладку и загружает PDF без предупреждения, даже в адаптивном режиме.