Recurso interpretado como Documento, mas transferido com o aplicativo / zip do tipo MIME

199

Com o Chrome 12.0.742.112, se eu redirecionar com os seguintes cabeçalhos:

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 se seguido retorna o seguinte cabeçalho:

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

O Chrome não redireciona nem altera a página anterior; apenas informa o seguinte aviso no console:

Recurso interpretado como Documento, mas transferido com o tipo MIME application / zip.

O processo funciona corretamente no Firefox e também funciona bem no Chrome se eu abrir uma nova guia e ir diretamente para http://0.0.0.0:3000/files/download.zip. Estou fazendo algo errado ou isso é um bug / peculiaridade do Chrome?

Ashley Williams
fonte

Respostas:

168

Você pode especificar o atributo de download HTML5 na sua 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

Roy Hyunjin Han
fonte
3
O atributo "download" não é suportado no ie ou em outro navegador. se você tem um outras opções por favor me ajude
Renish Khunt
3
Isso corrige o Chrome, mas quebra outros navegadores. Meus telefones Android não baixam desse tipo de link.
Betty
38
suspiro. ESTE 'CORRECÇÃO' NÃO FUNCIONA PARA A maioria dos NAVEGADORES - apenas o Chrome. E é 2016, então também não espere isso tão cedo.
a20
2
Não faz diferença no Chrome 2019
Michael Rogers
17
@all É 2035 (eu vim do futuro) e não há computador para suportar isso.
Ali Farhoudi
34

No cabeçalho da sua solicitação, você enviou, o Content-Type: text/htmlque significa que deseja interpretar a resposta como HTML. Agora, mesmo que o servidor envie arquivos PDF, seu navegador tentará entendê-lo como HTML. Esse é o problema. Estou procurando ver qual poderia ser o motivo. :)

Saeed Neamati
fonte
Eu tentei enviá-lo Content-Type: application/zipsem sucesso, ele ainda tenta processá-lo como um 'Documento'. Provavelmente também vale a pena ressaltar que o URL do zip é dinâmico no meu aplicativo, por isso não tem nada a ver com o cache.
Ashley Williams
1
Obrigado! Poderia ser algo a ver com o Chrome enviando o Acceptcabeçalho da solicitação text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, talvez? Estou absolutamente perplexo aqui, estou mesmo!
Ashley Williams
5
Não, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8há uma parte que diz que o Chrome aceita quase tudo ( */*).
Saeed Neamati
3
Do que você está falando? Não há cabeçalho de solicitação na pergunta. Ambos são cabeçalhos de resposta.
doubleDown 12/08/19
1
E eu estou sentado aqui me perguntando por que isso deveria ser uma resposta, mas não um comentário?
painel
24

Experimentei esse problema ao exibir um arquivo PDF (tipo MIME application / pdf) e o resolvi definindo o cabeçalho Content-Disposition, por exemplo:

Content-Disposition: attachment; filename=foo.pdf

Espero que ajude.

Evan
fonte
11
mas onde escrever isso?
quer
4
@ codificador Você adiciona cabeçalhos como este em seu servidor da web. Não sabe o que está usando para isso, por isso é difícil fornecer mais informações. Qual idioma ou estrutura você está usando para o seu servidor?
Evan
7
Tenha isso em nossas cabeçalhos mas o Chrome ainda lança a advertência
Adam Reis
nopes não fixar qualquer coisa em cromo versão 76.0.3809.132 (Versão oficial) (64-bit) i já os cabeçalhos anexado
Muhammad Omer Aslam
22

Eu consertei isso ... simplesmente abrindo uma nova guia.

Por que não estava funcionando, não tenho muita certeza, mas poderia ter algo a ver com o modo como o Chrome lida com vários downloads em uma página, talvez pensasse que eram spam e os ignorasse.

Ashley Williams
fonte
6
O que você quer dizer com "abriu uma nova guia" ??? Você abriu manualmente uma nova janela do navegador e colou o URL de download lá?
Tony R
2
Sim, exatamente. Presumi que fosse um bug no estado do aplicativo da guia específica.
Ashley Williams
52
Eu não esperaria que o usuário abrisse uma nova guia ... E também não acho a abertura de uma para baixar um arquivo elegante.
Yassir Ennazk
24
@Joram et. al. - abrir uma guia para um download (usando o alvo '_blank') - não resolve o problema, apenas transfere a mensagem de aviso do console "Recurso interpretado como documento" para uma nova guia. Varrer para debaixo do tapete não é a solução.
colm.anseo
1
Isso claramente não resolve a resposta original. Sério ... O que eu colocaria no documento do usuário "copie o URL, abra uma nova guia, cole o URL, ..."? Negócios em baixa.
Stranded Kid
22

Não consegui encontrar em lugar algum apenas uma explicação da mensagem por si só. Aqui está a minha interpretação.

Pelo que entendi, o Chrome esperava algum material que pudesse exibir (um documento ), mas obteve algo que não pôde exibir (ou algo que foi instruído a não exibir).

Esta é uma questão de como o documento foi declarado no nível da página HTML href(veja o downloadatributo na mensagem de Roy) e como é declarado na resposta do servidor por meio de cabeçalhos HTTP (em particular Content-Disposition). Esta é uma questão de contrato , em oposição à esperança e expectativa.

Para continuar no caminho de Evan, experimentei isso:

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

é apenas inconsistente com:

<a href='some.pdf'>

O Chrome irá chorar Recurso interpretado como documento, mas transferido…

Na verdade, a disposição do anexo significa apenas isso: o navegador não deve interpretar o link, mas armazená-lo em algum lugar para outros fins ocultos. Aqui acima, um downloadestá faltando ao lado hrefou Content-dispositiondeve ser removido dos cabeçalhos. Depende se queremos que o navegador renderize o documento ou não.

Espero que isto ajude.

Champignac
fonte
9

Encontrei esse mesmo problema hoje com a versão 30.0.1599.66 do Chrome com meu aplicativo node.js / express.js.

Os cabeçalhos estão corretos, expressos os define corretamente automaticamente, funciona em outros navegadores conforme indicado, colocando o atributo html 5 'download' não resolve, o que fez resolveu é entrar nas configurações avançadas do chrome e marcar a caixa "Pergunte onde salvar cada arquivo antes de baixar ".

Depois disso, não houve erro "Recurso interpretado como documento ...." relatado como no título deste problema, para que pareça que o código do servidor esteja correto, é o Chrome que está relatando incorretamente esse erro no console quando está definido para salvar arquivos para um local automaticamente.

JohnC
fonte
9

Eu tive um problema semelhante ao realizar um download de arquivo através de Javascript. A adição do atributo de download não fez diferença, mas a adição de target = '_ blank' ocorreu - não recebo mais a mensagem do console 'Resource interpretated as Document ...'.

Aqui está o meu código bem simples:

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

Eu não tentei com HTML direto, mas esperaria que funcionasse.

Observe que descobri que o Firefox exige que o link seja anexado ao documento, enquanto o Chrome funcionará sem ele.

Elliveny
fonte
4
apenas um aviso, um target = '_blank' irá acionar mecanismo de prevenção de pop-up ou seja, 11 de ...
RobM
4

Encontrei isso quando atribuí src = "image_url" em um iframe. Parece que o iframe o interpreta como um documento, mas não é. É por isso que exibe um aviso.

Carmela
fonte
você poderia me dizer como resolveu? como im enfrentando o mesmo problema aqui quando usando um iframe
Shikha thakur
Eu usei dados do formulário: var photoData = new FormData(); e, em seguida, defina a propriedade contentType: falsena minha solicitação ajax. A solicitação de postagem será: Content-Disposition: form-data;E o tipo de conteúdoContent-Type: text/html
Carmela
3

Eu resolvi o problema pelo adding target="_blank"link. Com isso, o chrome abre uma nova guia e carrega o PDF sem aviso, mesmo no modo responsivo.

med
fonte
Eu fiz isso e funcionou: window.open(href, '_blank');e a nova guia se fecha automaticamente após o download.
Chad Richardson
1

Eu tive esse problema em um projeto de site da ASP. A adição de um cabeçalho "Comprimento do conteúdo" fez com que os downloads voltassem a funcionar no Chrome.

R. Salisbury
fonte
1

Este problema foi reaparecido na versão Chrome 61. Mas parece que está corrigido no Chrome 62.

Eu tenho uma RewriteRule como abaixo

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

Com o Chrome 61, o PDF não estava abrindo; no console, estava mostrando a mensagem

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

Tentamos adicionar o tipo mime na regra de reescrita como abaixo, mas isso não ajudou.

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

Atualizei meu Chrome para a versão 62 mais recente e ele começou a mostrar o PDF novamente. Mas a mensagem ainda está lá no console.

Com todos os outros navegadores, estava / está funcionando bem.

Asif Nowaj
fonte
1

Acabei de encontrar esta e nenhuma das outras informações que pude encontrar ajudaram: foi um erro estúpido: eu estava enviando saída para o navegador antes de iniciar o download do arquivo. Surpreendentemente, não encontrei erros úteis (como "cabeçalhos já enviados" etc.). Felizmente, isso poupa a alguém um pouco de sofrimento!

user6096790
fonte
0

No meu caso, o nome do arquivo era muito longo e obteve o mesmo erro. Uma vez encurtado abaixo de 200 caracteres, funcionou bem. (o limite pode ser 250?)

holdfenytolvaj
fonte
0

Eu recebi esse erro porque estava servindo no meu sistema de arquivos. Depois que eu comecei com um servidor http, o chrome conseguia descobrir.

remydib
fonte
0

Eu estava enfrentando o mesmo problema com um gerenciador de downloads que criei. O problema que eu estava envolvendo era o nome do arquivo muito longo e a extensão sendo cortada.

Exemplo: nome do arquivo: protocolos organizacionais e outras coisas importantes.pd

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

Solução: aumentou o campo do banco de dados MySQL para 255 para armazenar o nome do arquivo e executou uma verificação de comprimento antes de salvar o blob. Se o comprimento> 255, reduza para 250 e adicione a extensão do arquivo.

eradima
fonte
0

Experimente o código abaixo e espero que isso funcione para você.

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

Eu já enfrentei isso hoje e meu problema foi que minha Content-Dispositiontag foi definida incorretamente. Parece para ambos pdfe application/x-zip-compressed, você deve configurá-lo para em inlinevez deattachment .

Então, para definir seu cabeçalho, o código Java ficaria assim:

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