Ao definir Content-Type como application/octet-stream, o conteúdo gerado dinamicamente pode ser baixado como um arquivo. Acredito que todos saibam disso. Em seguida, use Content-Disposition para definir o nome do arquivo baixado. Muitas pessoas sabem disso. Basicamente, o programa de download é escrito assim:
<?php$filename = “document.txt”;header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print “Olá!”;?>Depois de abri-lo com um navegador, você pode baixar o document.txt.
No entanto, se $filename estiver codificado em UTF-8, alguns navegadores não poderão lidar com isso corretamente. Por exemplo, altere ligeiramente o programa acima:
<?php$filename = "Chinese file name.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print “Hello!”;?> Se você salvar o programa na codificação UTF-8 e depois acessá-lo, o nome do arquivo baixado pelo IE6 ficará ilegível. O nome do arquivo baixado no FF3 contém apenas a palavra "Chinês". Tudo funciona bem no Opera 9.
O cabeçalho de saída realmente se parece com isto:
Content-Disposition: attachment filename=Chinese file name.txt Na verdade, de acordo com a definição de RFC2231, a codificação multilíngue Content-Disposition deve ser definida assim:
Content-Disposition: attachment ; nome do arquivo*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" significa:
adicione * antes do sinal de igual depois do nome do arquivo
O valor do nome do arquivo é dividido em três segmentos com aspas simples, que são conjunto de caracteres (utf8), idioma (vazio) e nome do arquivo codificado em urlen.
É melhor adicionar aspas duplas, caso contrário a parte após o espaço no nome do arquivo não será exibida no Firefox. Observe que o resultado do urlencode não é o mesmo que o resultado da função urlencode do PHP substituirá o espaço. +, e aqui precisa ser substituído por% 20
Após o teste, descobriu-se que o suporte de vários navegadores convencionais é o seguinte:
anexo IE6 = "<nome do arquivo UTF-8 após codificação de URL>";
Anexo FF3; nome do arquivo = "nome do arquivo UTF-8"
anexo; nome do arquivo*=”utf8”<nome do arquivo UTF-8 após codificação de URL>”
Anexo O9; nome do arquivo = "Nome do arquivo UTF-8"
Safari3 (Win) parece não ser compatível? Nenhum dos métodos acima funciona
. Parece que o programa deve ser escrito assim para suportar todos os navegadores convencionais:
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "Chinese file name.txt";$encoded_filename = urlencode( $filename);$encoded_filename = str_replace("+", "%20", $encoded_filename);header('Content-Type: application/octet-stream');if (preg_match("/MSIE/", $ua) ) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');} else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition : anexo; nome do arquivo*=”utf8'” . $nome do arquivo '"');} else { header('Disposição do conteúdo: anexo; nome do arquivo=”' . $nome do arquivo . '"');}print 'ABC ';?>