Preciso do tipo de conteúdo: application / octet-stream para baixar o arquivo?

414

O padrão HTTP diz:

Se este cabeçalho [Content-Disposition: attachment] for usado em uma resposta com o tipo de conteúdo application / octet-stream, a sugestão implícita é que o agente do usuário não deve exibir a resposta, mas digite diretamente uma `save response as .. caixa de diálogo.

Eu li isso como

Content-Type: application/octet-stream
Content-Disposition: attachment

Mas eu teria pensado que Content-Typeseria application/pdf, image/pngetc.

Devo ter Content-Type: application/octet-streamse quiser que os navegadores baixem o arquivo?

Paul Draper
fonte

Respostas:

959

Não.

O tipo de conteúdo deve ser o que é conhecido, se você o conhece. application/octet-streamé definido como "dados binários arbitrários" na RFC 2046, e há aqui uma sobreposição definitiva, sendo apropriado para entidades cujo único objetivo pretendido é ser salvo em disco e, a partir desse momento, estar fora de qualquer coisa "webby". Ou olhar de outra direção; a única coisa que se pode fazer com segurança com o application / octet-stream é salvá-lo em um arquivo e esperar que alguém saiba para que serve.

Você pode combinar o uso Content-Dispositioncom outros tipos de conteúdo, como image/pngou mesmo text/htmlpara indicar que deseja salvar, em vez de exibir. Costumava ser o caso de alguns navegadores ignorá-lo, text/htmlmas acho que isso foi há muito tempo neste momento (e eu vou dormir logo, então não vou começar a testar um monte de navegadores agora; talvez mais tarde).

A RFC 2616 também menciona a possibilidade de tokens de extensão e, atualmente, a maioria dos navegadores reconhece inlineque você deseja que a entidade seja exibida, se possível (ou seja, se é um tipo que o navegador sabe exibir, caso contrário, não há escolha). . É claro que esse é o comportamento padrão, mas significa que você pode incluir a filenameparte do cabeçalho que os navegadores usarão (talvez com algum ajuste para que as extensões de arquivo correspondam às normas do sistema local para o tipo de conteúdo em questão, talvez não) como sugestão, se o usuário tentar salvar.

Conseqüentemente:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png"

Significa "Não sei o que diabos é isso. Salve-o como um arquivo, de preferência chamado picture.png".

Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"

Significa "Esta é uma imagem PNG. Salve-a como um arquivo, de preferência com o nome picture.png".

Content-Type: image/png
Content-Disposition: inline; filename="picture.png"

Significa "Esta é uma imagem PNG. Exiba-a, a menos que você não saiba como exibir imagens PNG. Caso contrário, ou se o usuário optar por salvá-la, recomendamos o nome picture.png para o arquivo que você salvou como".

Naqueles navegadores que reconhecem que inlinealguns sempre o usariam, enquanto outros o usariam se o usuário selecionasse "salvar link como", mas não se selecionasse "salvar" enquanto visualizava (ou pelo menos o IE costumava ser assim). pode ter mudado alguns anos atrás).

Jon Hanna
fonte
30
Essa foi uma ótima resposta, e seria muito bom se as coisas funcionassem assim. Mas, infelizmente, todos os navegadores estão quebrados. Por exemplo, o Google Chrome não abrirá uma janela "salvar arquivo" para você, se esta for sua resposta em um formulário, independentemente de incluir "Disposição de conteúdo: anexo", mesmo com "aplicativo / fluxo de octetos" como o tipo de conteúdo . E então eles imprimem uma mensagem dizendo que você pode estar sob ataque ... Não há como permitir que eu salve um arquivo. Você precisa configurar o xdg-open, mesmo que queira apenas salvar um arquivo. Estou farto disso.
dividebyzero
1
@dividebyzero não é um problema que já tive, inclusive no Chrome. Existe algo mais incomum no que você está fazendo?
Jon Hanna
1
Carregar um arquivo com o enctype padrão seria incorreto e talvez o resultado disso tenha acionado alguma detecção de ataque, em vez de apenas cair para disponibilizar o conteúdo do arquivo.
Jon Hanna
7
@Wilt se o cliente quer salvá-lo, então não importa o que os cabeçalhos são enviados (você pode "salvar" ou "Salvar destino como" em qualquer coisa no seu navegador), como os cabeçalhos são informações, não exclui de modo attachmentpoderia ser considerado "melhor não exibir isso sozinho" e inline"melhor exibir isso sozinho, se puder". De qualquer forma, a maioria dos navegadores usará o valor do nome do arquivo como o nome sugerido do arquivo, mas os usuários sempre poderão substituí-lo.
Jon Hanna
1
@Tresdin thanks. Estou um pouco confuso por ser tão popular, em relação a alguns dos meus outros que consideraria melhor, mas suponho que deve ter chegado ao ponto de responder às questões das pessoas.
Jon Hanna