Recurso interpretado como Documento pero transferido con la aplicación tipo zip / MIME

199

Con Chrome 12.0.742.112, si redirecciono con los siguientes encabezados:

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

Que si se sigue devuelve el siguiente encabezado:

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 no redirigirá ni cambiará la página anterior, solo informará la siguiente advertencia en la consola:

Recurso interpretado como Documento pero transferido con aplicación tipo MIME / zip.

El proceso funciona correctamente en Firefox, y también funciona bien en Chrome si abro una nueva pestaña y voy directamente a http://0.0.0.0:3000/files/download.zip. ¿Estoy haciendo algo mal o es un error / peculiaridad de Chrome?

Ashley Williams
fuente

Respuestas:

168

Puede especificar el atributo de descarga HTML5 en su etiqueta <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
fuente
3
El atributo "descargar" no es compatible con ie o algún otro navegador. si tienes otras opciones, por favor ayúdame
Renish Khunt
3
Eso soluciona Chrome, pero rompe otros navegadores. Mis teléfonos Android no se descargarán desde ese tipo de enlace.
Betty
38
suspiro. ESTE 'ARREGLO' NO FUNCIONA PARA LA MAYORÍA DE LOS NAVEGADORES : solo Chrome. Y es 2016, así que tampoco esperes que sea pronto.
a20
2
No hace la diferencia en Chrome 2019
Michael Rogers
17
@todo es 2035 (vengo del futuro) y no hay computadora que lo admita.
Ali Farhoudi
34

En el encabezado de su solicitud, ha enviado, lo Content-Type: text/htmlque significa que desea interpretar la respuesta como HTML. Ahora, incluso si el servidor le envía archivos PDF, su navegador intenta entenderlo como HTML. Ese es el problema. Estoy buscando para ver cuál podría ser la razón. :)

Saeed Neamati
fuente
Intenté enviarlo Content-Type: application/zipsin resultado, todavía trata de procesarlo como un 'Documento'. Probablemente también valga la pena señalar que la URL zip es dinámica en mi aplicación, por lo que no tiene nada que ver con el almacenamiento en caché.
Ashley Williams
1
¡Gracias! ¿Podría tener algo que ver con que Chrome envíe el Acceptencabezado de la solicitud como text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, tal vez? Estoy absolutamente perplejo aquí, ¡realmente lo estoy!
Ashley Williams
55
No, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8hay una parte que dice que Chrome acepta casi todo ( */*).
Saeed Neamati
3
¿De qué estás hablando? No hay encabezado de solicitud en la pregunta. Ambos son encabezados de respuesta.
doubleDown el
1
Y estoy sentado aquí preguntándome por qué esto debería ser una respuesta, pero no un comentario.
tablero
24

Experimenté este problema al entregar un archivo PDF (aplicación tipo MIME / pdf) y lo resolví configurando el encabezado Content-Disposition, por ejemplo:

Content-Disposition: attachment; filename=foo.pdf

Espero que ayude.

Evan
fuente
11
pero donde escribir esto?
hud
44
@coder Agrega encabezados como este desde su servidor web. No estoy seguro de qué está usando para eso, por lo que es difícil dar más información. ¿Qué idioma o marco está utilizando para su servidor?
Evan
77
Tenga esto en nuestros encabezados, pero Chrome aún arroja la advertencia
Adam Reis,
no, no soluciona nada en Chrome Versión 76.0.3809.132 (Construcción oficial) (64 bits) Ya tengo los encabezados adjuntos
Muhammad Omer Aslam
23

He solucionado esto ... simplemente abriendo una nueva pestaña.

No estoy completamente seguro de por qué no funcionaba, pero podría tener algo que ver con la forma en que Chrome maneja las descargas múltiples en una página, tal vez pensó que eran spam y simplemente las ignoró.

Ashley Williams
fuente
66
¿Qué quieres decir con que "abriste una nueva pestaña"? ¿Abrió manualmente una nueva ventana del navegador y pegó la URL de descarga allí?
Tony R
2
Sí exactamente. Supuse que era un error en el estado de la aplicación de la pestaña en particular.
Ashley Williams
52
No esperaría que el usuario abra una nueva pestaña ... Y tampoco encuentro que abrir una para descargar un archivo sea elegante.
Yassir Ennazk
24
@Joram et. Alabama. - abrir una pestaña para una descarga (usando el objetivo '_blank') - no resuelve el problema, simplemente transfiere el mensaje de advertencia de la consola "Recurso interpretado como documento" a una nueva pestaña. Barrer debajo de la alfombra no es la solución.
colm.anseo
1
Esto claramente no resuelve la respuesta original. En serio ... ¿Qué pondría en el documento del usuario "copiar la url, abrir una nueva pestaña, pegar la url, ..."? Negocios caídos.
Stranded Kid
22

No pude encontrar en ninguna parte solo una explicación del mensaje por sí mismo. Aquí está mi interpretación.

Según tengo entendido, Chrome esperaba algo de material que podría mostrar (un documento ), pero obtuvo algo que no pudo mostrar (o algo que le dijeron que no mostrara).

Esta es una cuestión de cómo se declaró el documento en el nivel de página HTML href(ver el downloadatributo en el mensaje de Roy) y cómo se declara dentro de la respuesta del servidor mediante los encabezados HTTP (en particular Content-Disposition). Esta es una cuestión de contrato , en oposición a la esperanza y la expectativa.

Para continuar en el camino de Evan, he experimentado eso:

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

es simplemente inconsistente con:

<a href='some.pdf'>

Chrome llorará Recurso interpretado como documento pero transferido ...

En realidad, la disposición del archivo adjunto solo significa esto: el navegador no interpretará el enlace, sino que lo almacenará en algún lugar para otros fines ocultos. Aquí arriba, o downloadfalta al lado href, o Content-dispositiondebe eliminarse de los encabezados. Depende de si queremos que el navegador represente el documento o no.

Espero que esto ayude.

Champignac
fuente
9

Encontré este mismo problema hoy con Chrome Versión 30.0.1599.66 con mi aplicación node.js / express.js.

Los encabezados son correctos, express los configura correctamente de forma automática, funciona en otros navegadores como se indica, al colocar el atributo html 5 'download' no se resuelve, lo que resolvió es ir a la configuración avanzada de Chrome y marcar la casilla "Preguntar dónde guardar cada archivo antes de descargar ".

Después de eso, no hubo un error "Recurso interpretado como documento ..." informado como en el título de este problema, por lo que parece que nuestro código de servidor es correcto, es Chrome el que informa incorrectamente ese error en la consola cuando está configurado para guardar archivos a una ubicación automáticamente.

JohnC
fuente
9

Tuve un problema similar al realizar una descarga de archivos a través de Javascript. Agregar el atributo de descarga no hizo ninguna diferencia, pero agregar target = '_ blank' sí, ya no recibo el mensaje de consola 'Recurso interpretado como documento ...'.

Aquí está mi código muy simple:

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

No lo he probado con HTML directo, pero espero que funcione.

Tenga en cuenta que descubrí que Firefox requiere que el enlace se adjunte al documento, mientras que Chrome funcionará sin él.

Elliveny
fuente
44
solo una advertencia, un target = '_blank' activará el mecanismo de prevención emergente de IE 11 ...
RobM
4

Encontré esto cuando asigné src = "image_url" en un iframe. Parece que el iframe lo interpreta como un documento, pero no lo es. Es por eso que muestra una advertencia.

Carmela
fuente
¿podría decirme cómo lo arregló? como estoy enfrentando el mismo problema aquí cuando uso un iframe
Shikha thakur
Usé datos de formulario: var photoData = new FormData(); y luego configuré la propiedad contentType: falseen mi solicitud ajax. La solicitud de publicación será: Content-Disposition: form-data;Y el tipo de contenidoContent-Type: text/html
Carmela
3

Resolví el problema mediante adding target="_blank"el enlace. Con esto, Chrome abre una nueva pestaña y carga el PDF sin previo aviso incluso en modo receptivo.

medicina
fuente
Hice esto y funcionó: window.open(href, '_blank');y la nueva pestaña se cierra automáticamente después de la descarga.
Chad Richardson
1

Tuve este problema en un proyecto de sitio web ASP. Agregar un encabezado "Content-Length" hizo que las descargas comenzaran a funcionar nuevamente en Chrome.

R. Salisbury
fuente
1

Este problema volvió a aparecer en la versión Chrome 61. Pero parece que está arreglado en Chrome 62.

Tengo una RewriteRule como a continuación

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

Con Chrome 61, el PDF no se abría, en la consola mostraba el mensaje

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

Intentamos agregar el tipo mime en la regla de reescritura como se muestra a continuación, pero no sirvió de nada.

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

He actualizado mi Chrome a la última versión 62 y comenzó a mostrar el PDF nuevamente. Pero el mensaje sigue ahí en la consola.

Con todos los demás navegadores, estaba / está funcionando bien.

Asif Nowaj
fuente
1

Acabo de encontrar esto y ninguna de la otra información que pude encontrar ayudó: fue un error estúpido: estaba enviando resultados al navegador antes de comenzar la descarga del archivo. Sorprendentemente, no encontré errores útiles (como "encabezados ya enviados", etc.). ¡Con suerte, esto le ahorra a alguien más dolor!

usuario6096790
fuente
0

En mi caso, el nombre del archivo era demasiado largo y obtuve el mismo error. Una vez acortado por debajo de 200 caracteres funcionó bien. (¿el límite puede ser 250?)

holdfenytolvaj
fuente
0

Recibí este error porque estaba sirviendo desde mi sistema de archivos. Una vez que comencé con un servidor http, Chrome podría resolverlo.

remydib
fuente
0

Estaba experimentando el mismo problema con un administrador de descargas que creé. El problema que tuve fue que el nombre del archivo era demasiado largo y la extensión se cortaba.

Ejemplo: Nombre de archivo: Protocolos organizacionales y otras cosas que son importantes.pd

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

Solución: aumentó el campo de la base de datos MySQL a 255 para almacenar el nombre del archivo y realizó una comprobación de longitud antes de guardar el blob. Si la longitud es> 255, recórtela a 250 y agregue la extensión del archivo.

eradima
fuente
0

Pruebe el siguiente código y espero que esto funcione para usted.

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

Me he enfrentado a esto hoy, y mi problema fue que mi Content-Dispositionetiqueta se configuró incorrectamente. Parece que para ambos pdf& application/x-zip-compressed, se supone que debes configurarlo en inlinelugar de attachment.

Entonces, para configurar su encabezado, el código Java se vería así:

...
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.
fuente