Ressource interprétée comme Document mais transférée avec une application / zip de type MIME

200

Avec Chrome 12.0.742.112, si je redirige avec les en-têtes suivants:

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

Le cas échéant, renvoie l'en-tête suivant:

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 ne redirigera pas et ne modifiera pas la page précédente, il ne fera que signaler l'avertissement suivant dans la console:

Ressource interprétée comme Document mais transférée avec une application / zip de type MIME.

Le processus fonctionne correctement dans Firefox, et fonctionne également très bien dans Chrome si j'ouvre un nouvel onglet et que je vais directement sur http://0.0.0.0:3000/files/download.zip. Suis-je en train de faire quelque chose de mal, ou est-ce un bug / bizarrerie de Chrome?

Ashley Williams
la source

Réponses:

168

Vous pouvez spécifier l' attribut de téléchargement HTML5 dans votre balise <a>.

<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
la source
3
L'attribut "download" n'est pas pris en charge dans ie ou dans un autre navigateur. si vous avez d'autres options, aidez-moi
Renish Khunt
3
Cela corrige Chrome, mais brise les autres navigateurs. Mes téléphones Android ne seront pas téléchargés à partir de ce type de lien.
Betty
38
soupir. CE «FIX» NE FONCTIONNE PAS POUR LA PLUPART DES NAVIGATEURS - uniquement Chrome. Et c'est 2016, alors ne vous y attendez pas de si tôt non plus.
a20
2
Cela ne fait aucune différence dans Chrome 2019
Michael Rogers
17
@all C'est 2035 (je viens du futur) et il n'y a pas d'ordinateur pour le supporter.
Ali Farhoudi
34

Dans votre en-tête de demande, vous avez envoyé Content-Type: text/htmlce qui signifie que vous souhaitez interpréter la réponse en HTML. Maintenant, même si le serveur vous envoie des fichiers PDF, votre navigateur essaie de le comprendre en HTML. C'est le problème. J'essaie de voir quelle pourrait être la raison. :)

Saeed Neamati
la source
J'ai essayé de l'envoyer car Content-Type: application/zipen vain, il essaie toujours de le traiter comme un «document». Il convient également de souligner que l'URL zip est dynamique dans mon application, donc cela n'a rien à voir avec la mise en cache.
Ashley Williams
1
Merci! Cela pourrait-il être lié à l'envoi de l'en- Accepttête de demande par Chrome text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, peut-être? Je suis absolument perplexe ici, je le suis vraiment!
Ashley Williams
5
Non, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8il y a une partie qui dit que Chrome accepte presque tout ( */*).
Saeed Neamati
3
Qu'est-ce que tu racontes? Il n'y a pas d'en-tête de demande dans la question. Les deux sont des en-têtes de réponse.
doubleDown
1
Et je suis assis ici à me demander pourquoi cela devrait être une réponse mais pas un commentaire?
tableau de bord
24

J'ai rencontré ce problème lors de la diffusion d'un fichier PDF (application de type MIME / pdf) et je l'ai résolu en définissant l'en-tête Content-Disposition, par exemple:

Content-Disposition: attachment; filename=foo.pdf

J'espère que cela pourra aider.

Evan
la source
11
mais où écrire ça?
hud
4
@coder Vous ajoutez des en-têtes comme celui-ci à partir de votre serveur Web. Je ne sais pas ce que vous utilisez pour cela, il est donc difficile de donner plus d'informations. Quel langage ou framework utilisez-vous pour votre serveur?
Evan
7
Avoir cela dans nos en-têtes, mais Chrome lance toujours l'avertissement
Adam Reis
Non, il ne corrige rien sur la version 76.0.3809.132 de Chrome (version officielle) (64 bits), j'ai déjà les en-têtes attachés
Muhammad Omer Aslam
23

J'ai corrigé cela… en ouvrant simplement un nouvel onglet.

Pourquoi cela ne fonctionnait pas, je ne suis pas tout à fait sûr, mais cela pourrait avoir quelque chose à voir avec la façon dont Chrome traite les téléchargements multiples sur une page, peut-être qu'il pensait qu'il s'agissait de spam et les avait simplement ignorés.

Ashley Williams
la source
6
Que voulez-vous dire par "avoir ouvert un nouvel onglet" ??? Vous avez ouvert manuellement une nouvelle fenêtre de navigateur et y avez collé l'URL de téléchargement?
Tony R
2
Oui, exactement. J'ai supposé que c'était un bogue dans l'état d'application de l'onglet particulier.
Ashley Williams,
52
Je ne m'attendrais pas à ce que l'utilisateur ouvre un nouvel onglet ... Et je ne trouve pas non plus l'ouverture d'un pour télécharger un fichier élégant.
Yassir Ennazk
24
@Joram et. Al. - ouvrir un onglet pour un téléchargement (en utilisant la cible '_blank') - ne résout pas le problème, il transfère simplement le message d'avertissement de la console "Resource intrepreted as Document" dans un nouvel onglet. Balayer sous le tapis n'est pas une solution.
colm.anseo
1
Cela ne résout clairement pas la réponse originale. Sérieusement ... Que dois-je mettre dans le doc utilisateur "copier l'url, ouvrir un nouvel onglet, coller l'url, ..."? Affaires en baisse.
Stranded Kid
22

Je ne pouvais trouver nulle part une explication du message en soi. Voici mon interprétation.

Autant que je sache, Chrome s'attendait à du matériel qu'il pourrait éventuellement afficher (un document ), mais il a obtenu quelque chose qu'il ne pouvait pas afficher (ou quelque chose qu'on lui avait dit de ne pas afficher).

Il s'agit à la fois de savoir comment le document a été déclaré au niveau de la page HTML dans href(voir l' downloadattribut dans le message de Roy) et comment il est déclaré dans la réponse du serveur au moyen d'en-têtes HTTP (notamment Content-Disposition). C'est une question de contrat , par opposition à l'espoir et à l'attente.

Pour continuer sur le chemin d'Evan, j'ai vécu cela:

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

est tout simplement incompatible avec:

<a href='some.pdf'>

Chrome va pleurer Ressource interprétée comme document mais transférée…

En fait, la disposition des pièces jointes signifie simplement ceci: le navigateur ne doit pas interpréter le lien, mais plutôt le stocker quelque part à d'autres fins — cachées —. Ci-dessus, soit il downloadmanque à côté href, soit il Content-dispositiondoit être supprimé des en-têtes. Cela dépend si nous voulons que le navigateur rende le document ou non.

J'espère que cela t'aides.

Champignac
la source
9

J'ai rencontré ce même problème aujourd'hui avec Chrome Version 30.0.1599.66 avec mon application node.js / express.js.

Les en-têtes sont corrects, express les définit correctement automatiquement, cela fonctionne dans les autres navigateurs comme indiqué, en mettant l'attribut de téléchargement html 5 ne résout pas, ce qui l' a résolu va dans les paramètres avancés de chrome et en cochant la case "Demander où enregistrer chaque fichier avant le téléchargement ".

Après cela, aucune erreur "Ressource interprétée comme document ...." n'a été signalée comme dans le titre de ce problème, il semble donc que notre code de serveur soit correct, c'est Chrome qui signale incorrectement cette erreur dans la console lorsqu'il est configuré pour enregistrer. fichiers vers un emplacement automatiquement.

JohnC
la source
9

J'ai eu un problème similaire lors d'un téléchargement de fichier via Javascript. L'ajout de l'attribut de téléchargement n'a fait aucune différence, mais l'ajout de target = '_ blank' l'a fait - je ne reçois plus le message de la console 'Ressource interprétée comme document ...'.

Voici mon code très simple:

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

Je ne l'ai pas essayé avec du HTML direct mais je m'attendrais à ce qu'il fonctionne.

Notez que j'ai découvert que Firefox nécessite que le lien soit ajouté au document tandis que Chrome fonctionnera sans lui.

Elliveny
la source
4
juste un avertissement, un target = '_blank' déclenchera le mécanisme de prévention des
popups d'
4

Je l'ai rencontré lorsque j'ai attribué src = "image_url" dans un iframe. Il semble que iframe l'interprète comme un document, mais ce n'est pas le cas. C'est pourquoi il affiche un avertissement.

Carmela
la source
pourriez-vous me dire comment vous l'avez résolu? comme je suis confronté au même problème ici lors de l'utilisation d'un iframe
Shikha thakur
J'ai utilisé des données de formulaire: var photoData = new FormData(); puis j'ai défini la propriété contentType: falsedans ma demande ajax. La demande de publication sera: Content-Disposition: form-data;Et le type de contenuContent-Type: text/html
Carmela
3

J'ai résolu le problème par adding target="_blank"le lien. Avec cela, Chrome ouvre un nouvel onglet et charge le PDF sans avertissement, même en mode réactif.

med
la source
Je l'ai fait et cela a fonctionné: window.open(href, '_blank');et le nouvel onglet se ferme automatiquement après le téléchargement.
Chad Richardson
1

J'ai eu ce problème dans un projet de site Web ASP. L'ajout d'un en-tête "Content-Length" a entraîné le redémarrage des téléchargements dans Chrome.

R. Salisbury
la source
1

Ce problème est réapparu dans la version Chrome 61. Mais il semble qu'il soit corrigé sur Chrome 62.

J'ai une règle de réécriture comme ci-dessous

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

Avec Chrome 61, le PDF ne s'ouvrait pas, dans la console il montrait le message

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

Nous avons essayé d'ajouter le type MIME dans la règle de réécriture comme ci-dessous, mais cela n'a pas aidé.

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

J'ai mis à jour mon Chrome vers la dernière version 62 et il a recommencé à afficher le PDF. Mais le message est toujours là dans la console.

Avec tous les autres navigateurs, cela fonctionnait / fonctionne bien.

Asif Nowaj
la source
1

Je suis juste tombé sur cela et aucune des autres informations que j'ai pu trouver n'a aidé: c'était une erreur stupide: j'envoyais la sortie au navigateur avant de commencer le téléchargement du fichier. Étonnamment, je n'ai trouvé aucune erreur utile trouvée (comme "en-têtes déjà envoyés", etc.). Avec un peu de chance, cela sauve quelqu'un d'autre de chagrin!

user6096790
la source
0

Dans mon cas, le nom de fichier était trop long et a obtenu la même erreur. Une fois raccourci en dessous de 200 caractères, il fonctionnait bien. (la limite pourrait être de 250?)

holdfenytolvaj
la source
0

J'ai eu cette erreur car je servais depuis mon système de fichiers. Une fois que j'ai commencé avec un serveur http, chrome pouvait le comprendre.

remydib
la source
0

Je rencontrais le même problème avec un gestionnaire de téléchargement que j'ai créé. Le problème que j'avais dû impliquer le nom de fichier étant trop long et l'extension coupée.

Exemple: nom de fichier: protocoles d'organisation et autres éléments importants.pd

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

Solution: augmentation du champ de base de données MySQL à 255 pour stocker le nom de fichier et vérification de la longueur avant d'enregistrer le blob. Si la longueur> 255, réduisez-la à 250 et ajoutez l'extension de fichier.

eradima
la source
0

Essayez le code ci-dessous et j'espère que cela fonctionnera pour vous.

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
la source
0

J'ai fait face à cela aujourd'hui, et mon problème était que mon Content-Dispositiontag a été mal réglé. Il ressemble aux deux pdf& application/x-zip-compressed, vous êtes censé le régler à la inlineplace de attachment.

Donc, pour définir votre en-tête, le code Java ressemblerait à ceci:

...
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.
la source