Ресурс интерпретируется как Документ, но передается с приложением MIME-типа /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
, Я делаю что-то не так, или это ошибка / изюминка Chrome?
21 ответ
Я исправил это... просто открыв новую вкладку.
Почему это не работает, я не совсем уверен, но это может иметь какое-то отношение к тому, как Chrome обрабатывает несколько загрузок на странице, возможно, он думал, что они были спамом, и просто игнорировал их.
Вы можете указать атрибут загрузки HTML5 в своем теге .
<a href="http://example.com/archive.zip" download>Export</a>
В заголовке вашего запроса вы отправили Content-Type: text/html
Это означает, что вы хотите интерпретировать ответ как HTML. Теперь, даже если сервер отправляет вам файлы PDF, ваш браузер пытается понять его как HTML. Это проблема. Я ищу, чтобы узнать причину.:)
Я не мог найти нигде просто объяснение сообщения само по себе. Вот моя интерпретация.
Насколько я понимаю, 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
должны быть удалены из заголовков. Это зависит от того, хотим ли мы, чтобы браузер отображал документ или нет.
Надеюсь это поможет.
Я столкнулся с этой проблемой при обслуживании файла PDF (MIME-тип application/pdf) и решил ее, установив заголовок Content-Disposition, например:
Content-Disposition: attachment; filename=foo.pdf
Надеюсь, это поможет.
У меня была похожая проблема при выполнении загрузки файла через 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 будет работать без нее.
Я столкнулся с этой же проблемой сегодня в Chrome версии 30.0.1599.66 с моим приложением node.js / express.js.
Заголовки правильные, экспресс устанавливает их правильно автоматически, он работает в других браузерах, как указано, использование html 5 атрибута "download" не разрешает, что помогло, он входит в дополнительные настройки chrome и ставит флажок "Спросить, где сохранить". каждый файл перед загрузкой ".
После этого не было сообщения об ошибке "Ресурс интерпретирован как документ....", как в названии этой проблемы, поэтому кажется, что код нашего сервера правильный, это Chrome, который неправильно сообщает об этой ошибке в консоли, когда он настроен на сохранение файлы в папку автоматически.
Я решил проблему adding target="_blank"
по ссылке. При этом Chrome открывает новую вкладку и загружает PDF без предупреждения даже в адаптивном режиме.
Я столкнулся с этим, когда я назначил src="image_url" в iframe. Кажется, что iframe интерпретирует это как документ, но это не так. Вот почему отображается предупреждение.
У меня была эта проблема в проекте веб-сайта ASP. Добавление заголовка "Content-Length" заставило загрузки снова начать работать в Chrome.
Просто наткнулся на это, и никакая другая информация, которую я смог найти, не помогла: это была глупая ошибка: я отправлял вывод в браузер перед началом загрузки файла. Удивительно, но я не нашел полезных ошибок (например, "заголовки уже отправлены" и т. Д.). Надеюсь, это спасет кого-то еще от горя!
Эта проблема вновь появилась в версии 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. Но сообщение все еще там в консоли.
Со всеми другими браузерами все было нормально.
Я получил эту ошибку, потому что я обслуживал из моей файловой системы. Как только я начал с http-сервера, Chrome мог это понять.
Проблема
У меня была аналогичная проблема. Получил сообщение в js
Ресурс интерпретируется как документ, но передается с типом MIME text/csv
Но я также получил сообщение в консоли Chrome
Смешанное содержимое: сайт «https://my-site/» был загружен через безопасное соединение, но файл «https://my-site/Download?id=99a50c7b» был перенаправлен через небезопасное соединение. Этот файл должен передаваться через HTTPS. Эта загрузка была заблокирована
Здесь говорится, что вам нужно использовать безопасное соединение (но схема уже https в сообщении, как ни странно...).
Проблема в том, что href для скачивания файлов построен на стороне сервера. И этот href использовал http в моем случае.
Решение
Поэтому я изменил схему на https при построении href для загрузки файла.
В моем случае имя файла было слишком длинным и получило такую же ошибку. После сокращения ниже 200 символов работал нормально. (предел может быть 250?)
Попробуйте код ниже, и я надеюсь, что это сработает для вас.
var Interval = setInterval(function () {
if (ReportViewer) {
ReportViewer.prototype.PrintReport = function () {
switch (this.defaultPrintFormat) {
case "Default":
this.DefaultPrint();
break;
case "PDF":
this.PrintAs("PDF");
previewFrame = document.getElementById(this.previewFrameID);
previewFrame.onload = function () { previewFrame.contentDocument.execCommand("print", true, null); }
break;
}
};
clearInterval(Interval);
}
}, 1000);
У меня возникла такая же проблема с менеджером загрузок, который я создал. Проблема в том, что имя файла было слишком длинным, а расширение обрезано.
Пример: Имя файла: Организационные протоколы и другие важные вещи.pd
<?php
header("Content-Disposition: attachment; filename=$File_Name");
?>
Решение: Увеличено поле базы данных MySQL до 255 для хранения имени файла и выполнена проверка длины перед сохранением большого двоичного объекта. Если длина> 255, обрежьте его до 250 и добавьте расширение файла.
Я столкнулся с этим сегодня, и моя проблема заключалась в том, что мой Content-Disposition
тег был установлен неправильно. Похоже, для обоихpdf
& application/x-zip-compressed
, вы должны установить его на inline
вместо того attachment
.
Итак, чтобы установить заголовок, код Java будет выглядеть так:
...
String fileName = "myFileName.zip";
String contentDisposition = "attachment";
if ("application/pdf".equals(contentType)
|| "application/x-zip-compressed".equals(contentType)) {
contentDisposition = "inline";
}
response.addHeader("Content-Disposition", contentDisposition + "; filename=\"" + fileName + "\"");
...
Проблема
Я буквально цитирую Саида Неамати ( /questions/29851511/resurs-interpretiruetsya-kak-dokument-no-peredaetsya-s-prilozheniem-mime-tipa-zip/29851536#29851536):
В заголовке вашего запроса вы отправили Content-Type: text/html, что означает, что вы хотели бы интерпретировать ответ как HTML. Теперь, если даже сервер отправляет вам файлы PDF, ваш браузер пытается понять их как HTML.
Решение
Отправьте чертовски правильный заголовок. Отправьте правильный MIME-тип файла. Период!
Как?
Ааа. Это полностью зависит от того, что вы делаете (ОС, язык).
Моя проблема была с динамически созданной ссылкой для скачивания в javascript. Ссылка для скачивания mp3 файла. Файл mp3 не является документом, равно как и файл pdf, файл zip, файл flac, и этот список можно продолжить.
Поэтому я создал ссылку следующим образом:
Задача решена. Добавление дополнительного атрибута к тегу формы решило эту проблему. Но универсального решения нет. Есть много разных сценариев. Когда вы отправляете файл с сервера (вы создали его динамически с помощью такого языка, как CX#, Java, PHP), вы должны отправить с ним правильные заголовки.
Примечание: будьте осторожны и не отправляйте ничего (текста!) до того, как отправите заголовок (заголовки).
После пары загрузок CSV-файла (много тестов) хром спросил, разрешить ли больше загрузок с этой страницы. Я просто закрыл окно. После этого хром больше не загружал файл, но консоль сказала:
«Ресурс интерпретируется как документ, но передается с типом MIME text/csv»
Я мог бы решить эту проблему, перезапустив хром (полностью Ctrl-Shift-Q).
[Обновление] Не знаю, почему этот пост был удален, но он дал мне решение. Ранее я получил сообщение о попытке загрузить несколько файлов и, должно быть, ответил отрицательно. Я получил сообщение "Ресурс интерпретирован...", пока не перезапустил браузер; тогда он работал отлично. В некоторых случаях это может быть правильным ответом.
У меня та же ошибка, решением было поставить атрибут
target = "_ blank"
В заключение:
<a href="/uploads/file.*" target="_blank">Download</a>
куда *
- это расширение загружаемого файла.