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

200

В 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?

Эшли Уильямс
источник

Ответы:

168

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

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

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

Рой Хёнджин Хан
источник
3
Атрибут "download" не поддерживается в ie или каком-либо другом браузере. если у вас есть другие варианты, пожалуйста, помогите мне
Renish Khunt
3
Это исправляет Chrome, но ломает другие браузеры. Мои телефоны Android не будут загружаться по такой ссылке.
Бетти
38
вздох. ЭТО «FIX» НЕ РАБОТАЕТ ДЛЯ САМЫХ БРАУЗЕРОВ - только Chrome. И это 2016, так что не ждите этого в ближайшее время.
20
2
Не имеет значения в Chrome 2019
Майкл Роджерс
17
@all Это 2035 (я из будущего), и нет компьютера, который бы поддерживал это.
Али Фархуди
34

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

Саид Нямати
источник
Я пытался отправить его как Content-Type: application/zipбезрезультатно, он все еще пытается обработать его как «Документ». Вероятно, также стоит отметить, что почтовый URL-адрес является динамическим в моем приложении, так что это не имеет ничего общего с кэшированием.
Эшли Уильямс
1
Спасибо! Может быть, это связано с тем, что Chrome отправляет Acceptзаголовок запроса как text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, возможно? Я здесь абсолютно тупой, правда!
Эшли Уильямс
5
Нет, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8есть часть, которая говорит, что Chrome принимает почти все ( */*).
Саид Нимати
3
О чем ты говоришь? В вопросе нет заголовка запроса. Оба они являются заголовками ответа.
Двойной Вниз
1
И я сижу здесь, удивляясь, почему это должен быть ответ, а не комментарий?
приборная панель
24

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

Content-Disposition: attachment; filename=foo.pdf

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

Evan
источник
11
а куда это написать?
hud
4
@coder Вы добавляете такие заголовки со своего веб-сервера. Не уверен, что вы используете для этого, поэтому трудно дать больше информации. Какой язык или рамки вы используете для своего сервера?
Эван
7
Имейте это в наших заголовках, но Chrome все еще выдает предупреждение
Адам Рейс
Нет, это ничего не исправляет в Chrome Версия 76.0.3809.132 (Официальная сборка) (64-разрядная версия ) У меня уже есть прикрепленные заголовки
Мухаммед Омер Аслам
23

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

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

Эшли Уильямс
источник
6
Что значит "ты открыл новую вкладку" ??? Вы вручную открыли новое окно браузера и вставили туда URL для загрузки?
Тони Р
2
Да, точно. Я предположил, что это была ошибка в состоянии приложения конкретной вкладки.
Эшли Уильямс
52
Я не ожидал бы, что пользователь откроет новую вкладку ... И я не нахожу открывающей вкладку для загрузки элегантного файла.
Ясир Энназк
24
@Joram et. и др. - открытие вкладки для загрузки (с использованием цели «_blank») - не решает проблему, а просто передает предупреждение консоли «Ресурс как документ» на новую вкладку. Подметание под ковром не является решением проблемы.
colm.anseo
1
Это явно не решает оригинальный ответ. Серьезно ... Что бы я положил в пользовательскую документацию "скопировать URL, открыть новую вкладку, вставить URL, ..."? Дело вниз.
Многожильный Малыш
22

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

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

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

Champignac
источник
9

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

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

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

JohnC
источник
9

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

Elliveny
источник
4
просто предупреждение, target = '_blank' запустит механизм предотвращения всплывающих
окон
4

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

Кармела
источник
не могли бы вы сказать мне, как вы это исправили? так как я сталкиваюсь с той же проблемой здесь при использовании iframe
Shikha thakur
Я использовал данные формы: var photoData = new FormData(); и затем установил свойство contentType: falseв своем запросе ajax. Почтовый запрос будет: Content-Disposition: form-data;И контент-типContent-Type: text/html
Carmela
3

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

мед
источник
Я сделал это, и это сработало: window.open(href, '_blank');и новая вкладка автоматически закрывается после загрузки.
Чед Ричардсон
1

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

Р. Солсбери
источник
1

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

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

Асиф Новай
источник
1

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

user6096790
источник
0

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

holdfenytolvaj
источник
0

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

remydib
источник
0

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

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

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

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

eradima
источник
0

Попробуйте приведенный ниже код, и я надеюсь, что это сработает для вас.

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);
Faraz
источник
0

Я столкнулся с этим сегодня, и моя проблема была в том, что мой 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 + "\"");
...
Оливье Б.
источник