Ressource als Dokument interpretiert, aber mit Anwendung / Zip vom Typ MIME übertragen

199

Mit Chrome 12.0.742.112, wenn ich mit den folgenden Headern umleitung:

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

Wenn dies befolgt wird, wird der folgende Header zurückgegeben:

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 leitet die vorherige Seite nicht weiter und ändert sie auch nicht. Es wird lediglich die folgende Warnung in der Konsole angezeigt:

Ressource als Dokument interpretiert, aber mit Anwendung / Zip vom Typ MIME übertragen.

Der Vorgang funktioniert in Firefox ordnungsgemäß und auch in Chrome, wenn ich einen neuen Tab öffne und direkt zu gehe http://0.0.0.0:3000/files/download.zip. Mache ich etwas falsch oder ist dies ein Fehler / eine Eigenart von Chrome?

Ashley Williams
quelle

Antworten:

168

Sie können das HTML5- Download- Attribut in Ihrem <a> -Tag angeben .

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

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

Roy Hyunjin Han
quelle
3
Das Attribut "download" wird in dh oder einem anderen Browser nicht unterstützt. Wenn Sie andere Möglichkeiten haben, helfen Sie mir bitte
Renish Khunt
3
Das behebt Chrome, bricht aber andere Browser. Meine Android-Telefone werden nicht über diese Art von Link heruntergeladen.
Betty
38
Seufzer. DIESES 'FIX' FUNKTIONIERT NICHT FÜR DIE MEISTEN BROWSER - nur für Chrome. Und es ist 2016, also erwarten Sie es auch nicht so bald.
a20
2
Macht keinen Unterschied in Chrome 2019
Michael Rogers
16
@all Es ist 2035 (ich komme aus der Zukunft) und es gibt keinen Computer, der dies unterstützt.
Ali Farhoudi
34

In Ihrem Anforderungsheader haben Sie gesendet, Content-Type: text/htmlwas bedeutet, dass Sie die Antwort als HTML interpretieren möchten. Wenn Ihnen sogar ein Server PDF-Dateien sendet, versucht Ihr Browser, diese als HTML zu verstehen. Das ist das Problem. Ich suche nach dem Grund. :) :)

Saeed Neamati
quelle
Ich habe versucht, es als vergeblich zu senden Content-Type: application/zip, es versucht immer noch, es als 'Dokument' zu verarbeiten. Es ist wahrscheinlich auch erwähnenswert, dass die Zip-URL in meiner App dynamisch ist, sodass es nichts mit Caching zu tun hat.
Ashley Williams
1
Vielen Dank! Könnte es etwas damit zu tun haben, dass Chrome den AcceptAnforderungsheader als sendet text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8? Ich bin hier absolut ratlos, das bin ich wirklich!
Ashley Williams
5
Nein, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8es gibt einen Teil, der besagt, dass Chrome fast alles akzeptiert ( */*).
Saeed Neamati
3
Worüber redest du? Die Frage enthält keinen Anforderungsheader. Beide sind Antwortheader.
DoubleDown
1
Und ich sitze hier und frage mich, warum dies eine Antwort sein sollte, aber kein Kommentar?
Dashboard
24

Ich habe dieses Problem beim Bereitstellen einer PDF-Datei (MIME-Typ-Anwendung / PDF) festgestellt und es durch Setzen des Content-Disposition-Headers behoben, z.

Content-Disposition: attachment; filename=foo.pdf

Hoffentlich hilft das.

Evan
quelle
11
aber wo soll man das schreiben?
Hud
4
@coder Sie fügen solche Header von Ihrem Webserver hinzu. Sie sind sich nicht sicher, was Sie dafür verwenden, daher ist es schwierig, weitere Informationen zu geben. Welche Sprache oder welches Framework verwenden Sie für Ihren Server?
Evan
7
Haben Sie dies in unseren Headern, aber Chrome wirft immer noch die Warnung
Adam Reis
Nein, es behebt nichts auf Chrome Version 76.0.3809.132 (Official Build) (64-Bit) Ich habe bereits die Header angehängt
Muhammad Omer Aslam
22

Ich habe das behoben ... indem ich einfach einen neuen Tab geöffnet habe.

Warum es nicht funktioniert hat, weiß ich nicht genau, aber es könnte etwas damit zu tun haben, wie Chrome mit mehreren Downloads auf einer Seite umgeht. Vielleicht dachte es, es handele sich um Spam und ignorierte sie einfach.

Ashley Williams
quelle
6
Was meinst du damit, dass du "einen neuen Tab geöffnet" hast ??? Sie haben manuell ein neues Browserfenster geöffnet und dort die Download-URL eingefügt?
Tony R
2
Ja genau. Ich nahm an, dass es sich um einen Fehler im Anwendungsstatus der jeweiligen Registerkarte handelte.
Ashley Williams
52
Ich würde nicht erwarten, dass der Benutzer einen neuen Tab öffnet ... Und ich finde es auch nicht elegant, einen zu öffnen, um eine Datei herunterzuladen.
Yassir Ennazk
24
@ Joram et. al. - Öffnen eines Tabs zum Herunterladen (mit dem Ziel '_blank') - Behebt das Problem nicht, sondern überträgt lediglich die Warnmeldung der Konsole "Als Dokument interpretierte Ressource" auf einen neuen Tab. Unter den Teppich kehren ist keine Lösung.
colm.anseo
1
Dies löst eindeutig nicht die ursprüngliche Antwort. Ernsthaft ... Was würde ich in das Benutzerdokument "Kopieren der URL, Öffnen eines neuen Tabs, Einfügen der URL, ..." einfügen? Geschäft runter.
Gestrandetes Kind
22

Ich konnte nirgendwo nur eine Erklärung der Botschaft finden. Hier ist meine Interpretation.

Soweit ich weiß, erwartete Chrome Material, das möglicherweise angezeigt werden könnte (ein Dokument ), aber es erhielt etwas, das nicht angezeigt werden konnte (oder etwas, das nicht angezeigt werden sollte).

Dies ist sowohl eine Frage, wie das Dokument auf der HTML-Seitenebene in deklariert wurde href(siehe das downloadAttribut in Roys Nachricht) als auch, wie es in der Antwort des Servers mittels HTTP-Headern deklariert wird (insbesondereContent-Disposition ) . Dies ist eine Vertragsfrage im Gegensatz zu Hoffnung und Erwartung.

Um Evans Weg fortzusetzen, habe ich Folgendes erlebt:

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

ist nur unvereinbar mit:

<a href='some.pdf'>

Chrome wird weinen Ressource als Dokument interpretiert, aber übertragen ...

Tatsächlich bedeutet die Anordnung der Anhänge nur Folgendes: Der Browser soll den Link nicht interpretieren, sondern ihn irgendwo für andere - versteckte - Zwecke speichern. Hier oben downloadfehlt entweder danebenhref oder Content-dispositionmuss aus den Headern entfernt werden. Es hängt davon ab, ob der Browser das Dokument rendern soll oder nicht.

Hoffe das hilft.

Champignac
quelle
9

Ich habe heute dasselbe Problem mit Chrome Version 30.0.1599.66 mit meiner Anwendung node.js / express.js festgestellt.

Die Header sind korrekt, Express - Sets sie automatisch richtig, es funktioniert in anderen Browsern wie angegeben, html setzen 5 ‚Download‘ Attribut nicht beheben können , was tat resolve es in die Chrom erweiterten Einstellungen wird und das Kontrollkästchen „Fragen Sie , wo sparen jede Datei vor dem Herunterladen ".

Danach wurde kein Fehler "Ressource als Dokument interpretiert ..." gemeldet, wie im Titel dieses Problems angegeben. Es scheint also, dass unser Servercode korrekt ist. Chrome meldet diesen Fehler fälschlicherweise in der Konsole, wenn er zum Speichern festgelegt ist Dateien automatisch an einen Speicherort.

JohnC
quelle
9

Ich hatte ein ähnliches Problem beim Ausführen eines Dateidownloads über Javascript. Das Hinzufügen des Download-Attributs machte keinen Unterschied, das Hinzufügen von target = '_ blank' jedoch - die Konsolenmeldung 'Ressource als Dokument interpretiert ...' wird nicht mehr angezeigt.

Hier ist mein schön einfacher Code:

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

Ich habe es nicht mit direktem HTML versucht, würde aber erwarten, dass es funktioniert.

Hinweis Ich habe festgestellt, dass in Firefox der Link an das Dokument angehängt werden muss, während Chrome ohne diesen Link funktioniert.

Elliveny
quelle
4
Nur eine Warnung, ein Ziel = '_blank' löst den Popup-Verhinderungsmechanismus von IE 11 aus ...
RobM
4

Ich bin darauf gestoßen, als ich src = "image_url" in einem Iframe zugewiesen habe. Es scheint, dass iframe es als Dokument interpretiert, aber es ist nicht. Deshalb wird eine Warnung angezeigt.

Carmela
quelle
Könnten Sie mir bitte sagen, wie Sie das Problem behoben haben?
Ich stehe
Ich habe Formulardaten verwendet: var photoData = new FormData(); und dann die Eigenschaft contentType: falsein meiner Ajax-Anfrage festgelegt. Die Post-Anfrage lautet: Content-Disposition: form-data;Und der InhaltstypContent-Type: text/html
Carmela
3

Ich habe das Problem durch adding target="_blank"den Link gelöst . Damit öffnet Chrome einen neuen Tab und lädt das PDF auch im Reaktionsmodus ohne Vorwarnung.

med
quelle
Ich habe das gemacht und es hat funktioniert: window.open(href, '_blank');und der neue Tab wird nach dem Download automatisch geschlossen.
Chad Richardson
1

Ich hatte dieses Problem in einem ASP-Website-Projekt. Durch Hinzufügen eines Headers "Content-Length" funktionierten Downloads in Chrome wieder.

R. Salisbury
quelle
1

Dieses Problem wurde in der Chrome 61-Version erneut angezeigt. Aber es scheint, dass es auf Chrome 62 behoben ist.

Ich habe eine RewriteRule wie unten

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

Bei Chrome 61 wurde das PDF nicht geöffnet, in der Konsole wurde die Nachricht angezeigt

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

Wir haben versucht, den MIME-Typ wie folgt in die Umschreiberegel einzufügen, aber es hat nicht geholfen.

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

Ich habe mein Chrome auf die neueste 62-Version aktualisiert und es wird wieder das PDF angezeigt. Die Nachricht befindet sich jedoch noch in der Konsole.

Mit allen anderen Browsern funktionierte / funktioniert es einwandfrei.

Asif Nowaj
quelle
1

Ich bin gerade darauf gestoßen, und keine der anderen Informationen, die ich finden konnte, hat geholfen: Es war ein dummer Fehler: Ich habe vor dem Starten des Dateidownloads eine Ausgabe an den Browser gesendet. Überraschenderweise wurden keine hilfreichen Fehler gefunden (wie "bereits gesendete Header" usw.). Hoffentlich erspart dies jemand anderem etwas Kummer!

user6096790
quelle
0

In meinem Fall war der Dateiname zu lang und hat den gleichen Fehler erhalten. Einmal unter 200 Zeichen gekürzt funktionierte gut. (Limit könnte 250 sein?)

holdfenytolvaj
quelle
0

Ich habe diesen Fehler erhalten, weil ich von meinem Dateisystem aus bedient habe. Sobald ich mit einem http-Server angefangen habe, konnte Chrome es herausfinden.

Remydib
quelle
0

Ich hatte die gleichen Probleme mit einem von mir erstellten Download-Manager. Das Problem war, dass der Dateiname zu lang war und die Erweiterung abgeschnitten wurde.

Beispiel: Dateiname: Organisationsprotokolle und andere wichtige Dinge.pd

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

Lösung: Das MySQL-Datenbankfeld wurde auf 255 erhöht, um den Dateinamen zu speichern, und vor dem Speichern des Blobs eine Längenprüfung durchgeführt. Wenn die Länge> 255 ist, reduzieren Sie sie auf 250 und fügen Sie die Dateierweiterung hinzu.

Eradima
quelle
0

Versuchen Sie den folgenden Code und ich hoffe, dass dies für Sie funktioniert.

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
quelle
0

Ich habe mich heute damit konfrontiert und mein Problem war, dass mein Content-DispositionTag falsch gesetzt wurde. Es sieht aus wie für beide pdf& application/x-zip-compressed, du solltest es auf inlineanstatt setzenattachment .

Um Ihren Header festzulegen, würde Java-Code folgendermaßen aussehen:

...
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 + "\"");
...
Olivier B.
quelle