Como usar o tipo CSV MIME?

125

Em um aplicativo da Web em que estou trabalhando, o usuário pode clicar em um link para um arquivo CSV. Não há um cabeçalho definido para o tipo MIME; portanto, o navegador o renderiza como texto. Gostaria que este arquivo fosse enviado como um arquivo .csv, para que o usuário possa abri-lo diretamente com calc, excel, gnumeric etc.

header('Content-Type: text/csv');
echo "cell 1, cell 2";

Esse código funciona conforme o esperado no meu computador (não é assim que sempre é?), Mas não funciona em outro computador.

Meu navegador é uma compilação noturna do FF 3.0.1 (no linux). Os navegadores em que não funcionou foram IE 7 e FF 3.0 (no Windows)

Há alguma peculiaridade que eu desconheço?

Tadeck
fonte

Respostas:

219

Você pode tentar forçar o navegador a abrir uma caixa de diálogo "Salvar como ...", fazendo algo como:

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
echo "cell 1, cell 2";

O que deve funcionar na maioria dos principais navegadores.

Sean Bright
fonte
12

Você não está especificando um idioma ou estrutura, mas o cabeçalho a seguir é usado para downloads de arquivos:

"Content-Disposition: attachment; filename=abc.csv"
gimel
fonte
5

Com o Internet Explorer, você geralmente precisa especificar o cabeçalho Pragma: public, bem como o download para funcionar corretamente.

header('Pragma: public');

Apenas meus 2 centavos ..

4 níveis
fonte
5
Pragma: público não tem nenhum significado para o Internet Explorer. (Eu trabalhei no componente em questão e verifiquei a fonte).
EricLaw
Possivelmente, a utilidade real disso é substituir um cabeçalho Pragma: no-cache pré-existente?
Doin
2

Este código pode ser usado para exportar qualquer arquivo, incluindo csv

// application/octet-stream tells the browser not to try to interpret the file
header('Content-type: application/octet-stream');
header('Content-Length: ' . filesize($data));
header('Content-Disposition: attachment; filename="export.csv"');
Yuri Korolov
fonte
2
"octetstream" pretende ser "octetstream"
EricLaw
2
Isso pode causar um aviso em alguns navegadores: Resource interpretado como documento mas transferido com tipo MIME application / octet-stream
mikeschuld