Ресурс інтерпретується як Документ, але передається за допомогою програми / zip типу MIME


199

Якщо в 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 не переспрямовує та не змінює попередню сторінку, вона просто повідомить таке консолі на консолі:

Ресурс інтерпретується як Документ, але передається за допомогою програми / zip типу MIME.

Процес працює належним чином у 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" не підтримується у тому чи іншому браузері. якщо у вас є інші варіанти, будь ласка, допоможіть мені
Renish Khunt

3
Це виправляє Chrome, але порушує інші веб-переглядачі. Мої телефони Android не завантажуватимуться з такого роду посилань.
Бетті

38
зітхати. ЦИЙ "ВИПУСК" НЕ ПРАЦЮЄ ДЛЯ НАЙБІЛЬШИХ ПОШУКІВ - лише Chrome. І це 2016 рік, тож не сподівайтесь, що скоро це також буде.
a20

2
Не має значення для Chrome 2019
Майкл Роджерс,

16
@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 приймає майже все ( */*).
Saeed Neamati

3
Про що ти говориш? У запитанні немає заголовка запиту. Обидва вони є заголовками відповідей.
подвійнеDown

1
І я сиджу тут, цікавлячись, чому це має бути відповідь, а не коментар?
інформаційна панель

24

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

Content-Disposition: attachment; filename=foo.pdf

Сподіваюся, що це допомагає.


11
але де це написати?
hud

4
@coder Ви додаєте такі заголовки зі свого веб-сервера. Не впевнений, що ви використовуєте для цього, тому важко дати більше інформації. Якою мовою чи основою ви користуєтесь для свого сервера?
Еван

7
Майте це в наших заголовках, але Chrome все ще накидає попередження
Адам Рейс

Ні, він нічого не виправляє на хромованій версії 76.0.3809.132 (Офіційна збірка) (64-розрядна) У мене вже додані заголовки
Мухаммад Омер Аслам

22

Я це виправив… просто відкривши нову вкладку.

Чому це не спрацювало, я не зовсім впевнений, але це може мати щось спільне з тим, як Chrome справляється з декількома завантаженнями на сторінці, можливо, він вважав, що вони є спамом і просто ігнорував їх.


6
Що ти означає, що ти "відкрив нову вкладку" ??? Ви вручну відкрили нове вікно веб-переглядача та вставили туди URL-адресу завантаження?
Тоні Р

2
Так, саме. Я припускав, що це помилка в стані програми певної вкладки.
Ешлі Вільямс

52
Я не очікував, що користувач відкриє нову вкладку ... І я не знаходжу відкриття, щоб завантажити файл елегантний.
Ясір Енназк

24
@Joram та ін. ін. - відкриття вкладки для завантаження (використовуючи цільовий '_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потрібно видалити із заголовків. Це залежить від того, хочемо ми, щоб браузер передавав документ чи ні.

Сподіваюсь, це допомагає.


9

З цією ж проблемою я зіткнувся сьогодні з версією Chrome 30.0.1599.66 за допомогою програми node.js / express.js.

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

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


9

У мене була аналогічна проблема при виконанні завантаження файлу з допомогою JavaScript. Додавання атрибуту завантаження не мало значення, але додавання target = '_ blank' зробило - я більше не отримую консольне повідомлення "Ресурс" як "Документ ...".

Ось мій дуже простий код:

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
просто попередження, target = '_blank' запустить механізм запобігання спливаючих вікон IE 11 ...
RobM

4

Я зіткнувся з цим, коли призначив src = "image_url" в iframe. Здається, що iframe трактує це як документ, але це не так. Ось чому воно відображає попередження.


скажіть, будь ласка, як ви це виправили? як я зіткнувся з тією ж проблемою тут, коли використовуєш
іфрейм

Я використав дані форми: var photoData = new FormData(); а потім встановив властивість contentType: falseу моєму запиті ajax. Запит на публікацію буде: Content-Disposition: form-data;А тип вмістуContent-Type: text/html
Кармела

3

Я вирішив проблему за adding target="_blank"посиланням. З цим chrome відкриває нову вкладку і завантажує PDF без попередження навіть у режимі чуйності.


Я зробив це, і це спрацювало: window.open(href, '_blank');і нова вкладка автоматично закривається після завантаження.
Чад Річардсон

1

У мене виникла ця проблема в проекті веб-сайтів ASP. Додавання заголовка "Довжина вмісту" призвело до того, що завантаження знову почали працювати в 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

Щойно наткнувся на це, і жодна інша інформація, яку я не міг знайти, не допомогла: це була дурна помилка: я надсилав вихід у браузер перед початком завантаження файлу. Дивно, але я не знайшов корисних помилок (наприклад, "заголовки вже надіслані" тощо). Сподіваємось, це рятує когось іншого горе!


0

У моєму випадку ім'я файлу було занадто довгим і отримало ту ж помилку. Після скорочення нижче 200 символів працював чудово. (обмеження може бути 250?)


0

Я отримав цю помилку, оскільки я працював з моєї файлової системи. Як тільки я почав із http-сервера, хром міг це зрозуміти.


0

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

Приклад: Назва файлу: Організаційні протоколи та інші важливі речі.pd

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

Рішення: збільшив поле бази даних MySQL до 255, щоб зберегти ім'я файлу, і здійснив перевірку довжини перед збереженням крапки. Якщо довжина> 255, обріжте його до 250 і додайте розширення файлу.


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);

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 + "\"");
...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.