Al configurar Content-Type en application/octet-stream, el contenido generado dinámicamente se puede descargar como un archivo. Creo que todo el mundo lo sabe. Luego use Content-Disposition para configurar el nombre del archivo descargado. Mucha gente lo sabe. Básicamente, el programa de descarga está escrito así:
<?php$filename = “document.txt”;header('Content-Type: application/octet-stream');header('Content-Disposition: adjunto; filename=' . $filename);print “¡Hola!”;?>Después de abrirlo con un navegador, puede descargar document.txt.
Sin embargo, si $filename está codificado en UTF-8, algunos navegadores no pueden manejarlo correctamente. Por ejemplo, cambie ligeramente el programa anterior:
<?php$filename = "Nombre de archivo chino.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: adjunto; filename=' . $filename);print “¡Hola!”;?> Si guarda el programa en codificación UTF-8 y luego accede a él, el nombre del archivo descargado por IE6 será confuso. El nombre del archivo descargado en FF3 solo tiene la palabra "chino". Todo funciona bien en Opera 9.
El encabezado de salida en realidad se ve así:
Content-Disposition: adjunto; nombre de archivo = nombre de archivo chino.txt De hecho, según la definición de RFC2231, la codificación en varios idiomas Content-Disposition debería definirse así:
Content-Disposition: adjunto ; filename*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" significa:
agregar * antes del signo igual; después del nombre del archivo
El valor del nombre del archivo se divide en tres segmentos con comillas simples, que son el conjunto de caracteres (utf8), el idioma (vacío) y el nombre del archivo codificado en URL.
Es mejor agregar comillas dobles; de lo contrario, la parte después del espacio en el nombre del archivo no se mostrará en Firefox. Tenga en cuenta que el resultado de urlencode no es el mismo que el resultado de la función urlencode de PHP. El código urlen de PHP reemplazará el espacio con. +, y aquí hay que reemplazarlo con %20
Después de las pruebas, se descubrió que el soporte de varios navegadores convencionales es el siguiente:
archivo adjunto IE6="<nombre de archivo UTF-8 después de la codificación URL>"
archivo adjunto FF3; nombre de archivo UTF-8;
archivo adjunto; nombre de archivo*=”utf8”<nombre de archivo UTF-8 después de la codificación URL>”
archivo adjunto O9; nombre de archivo UTF-8;
¿Safari3 (Win) parece no ser compatible? Ninguno de los métodos anteriores funciona
. Parece que el programa debe escribirse así para admitir todos los navegadores principales:
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "nombre de archivo chino.txt";$encoded_filename. = urlencode( $nombre_archivo);$nombre_archivo_codificado = str_replace("+", "%20", $nombre_archivo_codificado);header('Tipo de contenido: aplicación/flujo-octeto');if (preg_match("/MSIE/", $ua) ) { header('Content-Disposition: adjunto; filename="' . $encoded_filename . '"');} else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition : archivo adjunto; nombre de archivo*=”utf8'” . $nombre de archivo . '"');} else { encabezado('Disposición de contenido: archivo adjunto; nombre de archivo=”' . $nombre de archivo . '"');}imprimir 'ABC ';? >