Basicamente, isso acontece porque o site diz ao navegador para fazê-lo. Ocasionalmente, é porque o desenvolvedor do site decide que deseja esse comportamento, por exemplo, comum em sites de compartilhamento de arquivos. Outras vezes, é porque é uma opção padrão para qualquer software que eles estejam usando (por exemplo, software de fórum ou blog). Às vezes, é porque o desenvolvedor do site não tem ideia do que está fazendo.
Content-Disposition
Isso geralmente ocorre porque o site envia um Content-Disposition
cabeçalho na resposta. Especificamente, ele pode enviar um inline
ou attachment
.
inline
é o padrão, se não especificado de outra forma, e significa que o navegador abrirá o arquivo na janela do navegador, se puder.
attachment
significa sempre baixar o arquivo, nunca tente abri-lo dentro do navegador.
Se você abrir as ferramentas de desenvolvedor do navegador, verá que esse link específico envia os seguintes cabeçalhos de resposta:
Content-Disposition: attachment; filename="Schubert-Sonata-21-B-flat.pdf"
Content-Type: application/pdf
Isso instrui o navegador a sempre baixar ( attachment
) o arquivo e a fornecer o nome de arquivo padrão, em Schubert-Sonata-21-B-flat.pdf
vez de deduzi-lo da URL. Além disso, ele diz ao navegador (corretamente) que é um application/pdf
arquivo - mas, como é attachment
o navegador, o download ainda será o padrão.
Detalhes de manuseio em linha
Quando a Content-Disposition
está embutido (ou não especificado), o navegador tenta abrir o arquivo no visualizador incorporado padrão. Isso funciona apenas quando o navegador sabe qual é o tipo de arquivo e sabe como abrir esse tipo.
Detecção de tipo
O tipo de arquivo pode ser especificado pelo servidor com um Content-Type
cabeçalho. Por exemplo, os tipos em linha mais comuns são text/html
, application/javascript
e text/css
, tornando-se as três partes principais de um site moderno. Você também pode ter tipos mais esotéricos como application/pdf
.
Outra possibilidade é que o servidor tenha especificado um Content-Type
de application/octet-stream
. Esse é o tipo mais genérico e informa ao navegador que o arquivo é apenas um dado arbitrário; nesse momento, a única coisa que o navegador pode fazer é fazer o download (em teoria - vamos chegar a esse ponto).
Quando a Content-Type
não é especificado pelo servidor (e às vezes até quando), o navegador pode executar o que é conhecido como sniffing para tentar adivinhar o tipo lendo o arquivo e procurando padrões.
Manipulação de tipo
Ao receber um arquivo com uma inline
disposição ou não especificada, o navegador precisa tentar abri-lo no navegador, se possível. Para fazer isso, ele analisa o tipo de arquivo e, se reconhecer o tipo, tentará abri-lo. A maioria dos navegadores abrirá qualquer text/
tipo em um visualizador de texto simples, tentará renderizar text/html
como uma página da web, poderá abrir application/json
em um visualizador especial destacado por sintaxe , etc.
O tipo application/octet-stream
foi tratado especialmente. Como ele deve ser do tipo mais genérico, denotando um fluxo arbitrário de bytes, não deve haver nenhum manipulador que possa ser aplicado a todos os arquivos desse "tipo". Por exemplo, no Firefox, isso se manifesta como uma incapacidade de definir o manipulador padrão para application/octet-stream
.
Alguns sites também usaram tipos não padrão. Eu já vi application/force-download
usado - que acaba como um download porque o navegador não reconhece ou sabe o que mais fazer com o tipo, mas não possui o tratamento especial que application/octet-stream
faz.
Um pouco de uma lição de história
Para ver como os PDFs são manipulados, podemos nos aprofundar um pouco na história da web. Veja, no passado, os navegadores não tinham idéia do que é um PDF. Então eles não puderam abrir. Mas já vimos PDFs sendo abertos nos navegadores muito antes de os visualizadores de PDF integrados, então como isso funcionou?
Antes, era possível estender a funcionalidade do navegador com muito mais controle do que o que você pode fazer com extensões / addons limitados atualmente. Esses eram conhecidos genericamente como plugins . No Internet Explorer, eles eram controles ActiveX; no Mozilla Firefox e, mais tarde, no Google Chrome, eram plugins NPAPI. Esses plug-ins eram capazes de fazer tudo o que qualquer outro programa podia e, além disso, podiam se registrar como manipulador de um tipo de arquivo específico que, de outra forma, não seria reconhecido pelo navegador. (Aliás, isso foi considerado um grande risco de segurança e o suporte a esses plugins poderosos foi diminuindo gradualmente ...)
Nos dias dos plug-ins, você instalava o Adobe Acrobat Reader, que instalava um plug-in ActiveX ou NPAPI que registrava o application/pdf
tipo MIME e dizia ao navegador para abrir esses tipos on-line usando o plug-in.
Obviamente, depois de vários problemas de segurança e desempenho causados por esses plug-ins, os principais fornecedores de navegadores decidiram incorporar seus próprios visualizadores de PDF enquanto eliminavam o suporte para a maioria dos plug-ins. O único que ainda vemos é o Adobe Shockwave Flash, que suporta application/x-shockwave-flash
.
Na verdade, ainda existem alguns controles restantes para isso, por exemplo, no Firefox, a Preview in Firefox
opção ainda existe:
No passado, isso permitiria a escolha entre vários plugins que registravam esse tipo. Por exemplo, a lista de tipos registrados para o Flash:
Esses dias também foram antes de grande parte do suporte de mídia fornecido com o HTML5. Não eram apenas PDFs - seu navegador não teria idéia de como lidar com um contêiner MP4 ou vídeo H.264, como reproduzir um arquivo MP3, etc. etc. Você veria plugins fornecidos por players de mídia como o VLC ou mesmo o Windows Media Player, ou sites incorporariam um media player embutido no Flash.
Content-Type: application/octet-stream
mas isso é muito menos comum atualmente.