web-dev-qa-db-fra.com

Ressource interprétée comme un document mais transférée avec le type application/zip de MIME

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

Si suivi, retourne 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, ni ne changera 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 le type MIME application/Zip.

Le processus fonctionne correctement dans Firefox et fonctionne également correctement dans Chrome si j'ouvre un nouvel onglet et passe directement à http://0.0.0.0:3000/files/download.Zip. Est-ce que je fais quelque chose de mal ou est-ce un bug/excentricité de Chrome?

148
Ashley Williams

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

Pourquoi cela ne fonctionnait-il pas? Je ne suis pas tout à fait sûr, mais cela pourrait avoir un lien avec la façon dont Chrome gère plusieurs téléchargements sur une page. Peut-être pensait-il qu'il s'agissait de spam et les ignorait simplement.

18
Ashley Williams

Vous pouvez spécifier l'attribut HTML5 download 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

144
Roy Hyunjin Han

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

29
Saeed Neamati

J'ai rencontré ce problème lors de la création d'un fichier PDF (type application/pdf de type MIME) 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.

25
Evan

Je ne pouvais trouver nulle part une explication du message par lui-même. Voici mon interprétation.

Autant que je sache, Chrome attendait un contenu qu’il pourrait éventuellement afficher (un document), mais il obtiendrait un élément qu’il ne pourrait pas afficher (ou un élément qu’il était ordonné 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'attribut download dans le message de Roy) et comment il est déclaré dans la réponse du serveur au moyen d'en-têtes HTTP (en particulier Content-Disposition). C’est une question de contrat, par opposition à l’espoir et aux attentes.

Pour continuer sur le chemin d'Evan, j'ai expérimenté cela:

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

est juste incompatible avec:

<a href='some.pdf'>

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

En fait, la disposition attachment signifie simplement ceci: le navigateur ne doit pas interpréter le lien, mais plutôt le stocker quelque part à des fins autres, cachées. Ici ci-dessus, soit download est manquant à côté de href, soit Content-disposition doit ê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.

15
Champignac

J'ai rencontré le même problème aujourd'hui avec la version 30.0.1599.66 de Chrome avec mon application node.js/express.js.

Les en-têtes are corrects, express les définit correctement automatiquement, cela fonctionne dans les autres navigateurs comme indiqué, mettre l'attribut HTML 'download' ne résout pas, ce que (fait} _ résolut il va dans Paramètres avancés de chrome et en cochant la case "Demander où enregistrer chaque fichier avant de télécharger".

Après cela, aucune erreur "Ressource interprétée en tant que document ...." n'a été signalée dans le titre de ce problème. Il semble donc que le code de serveur notre est correct. C'est Chrome qui signale à tort cette erreur dans le message. console quand il est configuré pour enregistrer les fichiers à un emplacement automatiquement.

8
JohnC

J'ai rencontré ce problème lorsque j'ai affecté 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.

4
Carmela

J'ai eu ce problème dans un projet de site Web ASP. L'ajout d'un en-tête "Content-Length" a permis aux téléchargements de fonctionner à nouveau dans Chrome.

2
R. Salisbury

Ce problème a été réapparu sur la version Chrome 61. Mais il semble que cela soit corrigé à Chrome 62.

J'ai un RewriteRule 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, le message était affiché. 

"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 version 62 la plus récente, qui affiche à nouveau le PDF. Mais le message est toujours là dans la console.

Avec tous les autres navigateurs, cela fonctionnait bien.

1
Asif Nowaj

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

Voici mon code bien simple:

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

Je n'ai pas essayé avec HTML direct, mais je m'attendrais à ce que cela fonctionne.

Remarque J'ai découvert que Firefox nécessite que le lien soit ajouté au document, alors que Chrome fonctionnera sans lui.

1
Elliveny

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

1
remydib

Dans mon cas, le nom du fichier était trop long et a eu la même erreur. Une fois raccourci, moins de 200 caractères fonctionnaient bien. (limite pourrait être 250?)

0
holdfenytolvaj

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

0
med

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

Exemple: Nom de fichier: Protocoles d’organisation et autres éléments importants.pd

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

Solution: le champ de la base de données MySQL a été augmenté à 255 pour stocker le nom du fichier et une vérification de la longueur a été effectuée avant l'enregistrement du blob. Si la longueur> 255, réduisez-la à 250 et ajoutez l'extension de fichier.

0
eradima

Je n’ai rencontré que cela et aucune des informations que j’ai pu trouver n’a aidé: c’était une erreur stupide: j’envoyais une 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.). Espérons que cela sauve un peu de chagrin à quelqu'un d'autre!

0
user6096790