Risorsa interpretata come documento ma trasferita con applicazione / zip di tipo MIME


199

Con Chrome 12.0.742.112, se reindirizzo con le seguenti intestazioni:

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

Che se seguito restituisce la seguente intestazione:

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 non reindirizzerà, né cambierà la pagina precedente, segnalerà solo il seguente avviso nella console:

Risorsa interpretata come documento ma trasferita con applicazione / zip di tipo MIME.

Il processo funziona correttamente in Firefox e funziona bene anche in Chrome se apro una nuova scheda e vado direttamente a http://0.0.0.0:3000/files/download.zip. Sto facendo qualcosa di sbagliato o è un bug / stranezza di Chrome?


Risposte:


168

È possibile specificare l' attributo di download HTML5 nel tag <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
L'attributo "download" non è supportato in ie o in qualche altro browser. se hai altre opzioni, per favore, aiutami
Renish Khunt,

3
Ciò risolve Chrome, ma rompe altri browser. I miei telefoni Android non verranno scaricati da quel tipo di collegamento.
Betty,

38
sospiro. QUESTO 'FIX' NON FUNZIONA PER LA MAGGIOR PARTE DEI BROWSER - solo Chrome. Ed è il 2016, quindi non aspettarti che presto.
a20,

2
Non fa differenza in Chrome 2019
Michael Rogers,

17
@all È il 2035 (vengo dal futuro) e non esiste un computer per supportarlo.
Ali Farhoudi,

34

Nell'intestazione della richiesta, hai inviato il Content-Type: text/htmlche significa che desideri interpretare la risposta come HTML. Ora se anche il server ti invia file PDF, il tuo browser cerca di capirlo come HTML. Questo è il problema. Sto cercando di vedere quale potrebbe essere la ragione. :)


Ho provato a inviarlo come Content-Type: application/zipinutilmente, cerca ancora di elaborarlo come un "Documento". Probabilmente vale anche la pena sottolineare che l'URL zip è dinamico nella mia app, quindi non ha nulla a che fare con la memorizzazione nella cache.
Ashley Williams,

1
Grazie! Potrebbe essere qualcosa a che fare con Chrome che invia l' Acceptintestazione della richiesta come text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, forse? Sono assolutamente perplesso qui, lo sono davvero!
Ashley Williams,

5
No, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8c'è una parte che dice che Chrome accetta quasi tutto ( */*).
Saeed Neamati,

3
Di cosa stai parlando? Non ci sono intestazioni richieste nella domanda. Entrambi sono intestazioni di risposta.
doubleDown

1
E sono seduto qui a chiedermi perché questa dovrebbe essere una risposta ma non un commento?
cruscotto

24

Ho riscontrato questo problema durante la pubblicazione di un file PDF (applicazione di tipo MIME / pdf) e l'ho risolto impostando l'intestazione Content-Disposition, ad esempio:

Content-Disposition: attachment; filename=foo.pdf

Spero che aiuti.


11
ma dove scrivere questo?
hud,

4
@coder Aggiungi intestazioni come questa dal tuo server web. Non sono sicuro di cosa stai usando, quindi è difficile fornire maggiori informazioni. Quale lingua o framework stai usando per il tuo server?
Evan,

7
Tieni questo nelle nostre intestazioni, ma Chrome lancia ancora l'avvertimento
Adam Reis,

nopes non risolve nulla su Chrome Versione 76.0.3809.132 (build ufficiale) (64 bit) ho già le intestazioni collegate
Muhammad Omer Aslam

22

Ho risolto questo problema semplicemente aprendo una nuova scheda.

Perché non funzionasse non sono del tutto sicuro, ma potrebbe avere qualcosa a che fare con il modo in cui Chrome gestisce i download multipli su una pagina, forse pensava che fossero spam e li ha semplicemente ignorati.


6
Cosa vuoi dire con "hai aperto una nuova scheda" ??? Hai aperto manualmente una nuova finestra del browser e incollato l'URL di download lì?
Tony R,

2
Si, esattamente. Ho pensato che fosse un bug nello stato di applicazione della scheda particolare.
Ashley Williams,

52
Non mi aspetto che l'utente apra una nuova scheda ... E non trovo nemmeno aprirne una per scaricare un file elegante.
Yassir Ennazk,

24
@Joram et. al. - l'apertura di una scheda per un download (utilizzando la destinazione '_blank') - non risolve il problema, trasferisce semplicemente il messaggio di avviso della console "Risorsa interpretata come documento" in una nuova scheda. Spazzare sotto il tappeto non è la soluzione.
colm.anseo,

1
Questo chiaramente non risolve la risposta originale. Seriamente ... Cosa metterei nel documento utente "copia l'URL, apri una nuova scheda, incolla l'URL, ..."? Affari in calo.
Stranded Kid,

22

Non sono riuscito a trovare da nessuna parte solo una spiegazione del messaggio da solo. Ecco la mia interpretazione.

Per quanto ho capito, Chrome si aspettava del materiale che poteva eventualmente visualizzare (un documento ), ma ottenne qualcosa che non poteva visualizzare (o qualcosa che gli fu detto di non visualizzare).

Questa è sia una domanda su come il documento è stato dichiarato a livello di pagina HTML in href(vedere l' downloadattributo nel messaggio di Roy) sia su come viene dichiarato nella risposta del server tramite le intestazioni HTTP (in particolare Content-Disposition). Questa è una questione di contratto , al contrario di speranza e aspettativa.

Per continuare sulla via di Evan, ho sperimentato che:

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

non è coerente con:

<a href='some.pdf'>

Chrome piangerà Risorsa interpretata come documento ma trasferita ...

In realtà, la disposizione dell'allegato significa solo questo: il browser non deve interpretare il collegamento, ma piuttosto memorizzarlo da qualche parte per altri scopi nascosti. Qui sopra, o downloadmanca accanto hrefo Content-dispositiondeve essere rimosso dalle intestazioni. Dipende se vogliamo che il browser esegua il rendering del documento o meno.

Spero che questo ti aiuti.


9

Ho riscontrato oggi lo stesso problema con la versione 30.0.1599.66 di Chrome con la mia applicazione node.js / express.js.

Le intestazioni sono corrette, express le imposta correttamente in modo automatico, funziona in altri browser come indicato, mettendo l'attributo html 5 'download' non si risolve, cosa ha fatto risolto sta andando nelle impostazioni avanzate di Chrome e selezionando la casella "Chiedi dove salvare ogni file prima di scaricare ".

Dopodiché non è stato segnalato alcun errore "Risorsa interpretata come documento ...." come nel titolo di questo problema, quindi sembra che il nostro codice server sia corretto, è Chrome che segnala erroneamente tale errore nella console quando è impostato per salvare file in una posizione automaticamente.


9

Ho avuto un problema simile durante l'esecuzione di un download di file tramite Javascript. L'aggiunta dell'attributo download non ha fatto alcuna differenza, ma l'aggiunta di target = '_ blank' l'ha fatto: non ricevo più il messaggio della console "Risorsa interpretata come documento ...".

Ecco il mio codice piacevolmente semplice:

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

Non l'ho provato con HTML diretto ma mi aspetto che funzioni.

Nota ho scoperto che Firefox richiede che il collegamento sia aggiunto al documento mentre Chrome funzionerà senza di esso.


4
solo un avvertimento, un target = '_blank' attiverà il meccanismo di prevenzione dei popup di IE 11 ...
RobM

4

Ho riscontrato questo quando ho assegnato src = "image_url" in un iframe. Sembra che iframe lo interpreti come un documento ma non lo è. Ecco perché visualizza un avviso.


potresti per favore dirmi come l'hai risolto? come sto affrontando lo stesso problema qui quando si utilizza un iframe
Shikha thakur

Ho usato i dati del modulo: var photoData = new FormData(); e quindi ho impostato la proprietà contentType: falsenella mia richiesta Ajax. La richiesta di post sarà: Content-Disposition: form-data;E il tipo di contenutoContent-Type: text/html
Carmela,

3

Ho risolto il problema tramite adding target="_blank"il collegamento. Con questo, Chrome apre una nuova scheda e carica il PDF senza preavviso anche in modalità reattiva.


L'ho fatto e ha funzionato: window.open(href, '_blank');e la nuova scheda si chiude automaticamente dopo il download.
Chad Richardson,

1

Ho avuto questo problema in un progetto di sito Web ASP. L'aggiunta di un'intestazione "Lunghezza contenuto" ha fatto sì che i download riprendessero a funzionare in Chrome.


1

Questo problema è stato ripreso nella versione di Chrome 61. Ma sembra che sia stato risolto su Chrome 62.

Ho una RewriteRule come di seguito

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

Con Chrome 61, il PDF non si apriva, in console mostrava il messaggio

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

Abbiamo provato ad aggiungere il tipo mime nella regola di riscrittura come di seguito ma non è stato d'aiuto.

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

Ho aggiornato Chrome all'ultima versione 62 e ho iniziato a mostrare di nuovo il PDF. Ma il messaggio è ancora lì nella console.

Con tutti gli altri browser, funzionava / funziona bene.


1

Mi sono appena imbattuto in questo e nessuna delle altre informazioni che ho trovato ha aiutato: è stato un errore stupido: stavo inviando l'output al browser prima di iniziare il download del file. Sorprendentemente, non ho trovato errori utili (come "intestazioni già inviate" ecc.). Speriamo che questo risparmi qualcun altro al dolore!


0

Nel mio caso il nome del file era troppo lungo e ha avuto lo stesso errore. Una volta abbreviato sotto 200 caratteri funzionava bene. (il limite potrebbe essere 250?)


0

Ho ricevuto questo errore perché stavo servendo dal mio file system. Una volta che ho iniziato con un server http Chrome è riuscito a capirlo.


0

Stavo riscontrando lo stesso problema con un download manager che ho creato. Il problema che avevo riscontrato era che il nome del file era troppo lungo e l'estensione veniva troncata.

Esempio: Nome file: protocolli organizzativi e altre cose importanti.pd

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

Soluzione: aumentato il campo del database MySQL a 255 per memorizzare il nome del file ed eseguito un controllo della lunghezza prima di salvare il BLOB. Se la lunghezza> 255 lo riduce fino a 250 e aggiungi l'estensione del file.


0

Prova sotto il codice e spero che questo funzioni per te.

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

Oggi ho affrontato questo problema e il mio problema era che il mio Content-Dispositiontag era stato impostato erroneamente. Sembra per entrambi pdf& application/x-zip-compressed, dovresti impostarlo su inlineinvece di attachment.

Quindi, per impostare l'intestazione, il codice Java sarebbe simile al seguente:

...
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 + "\"");
...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.