Explicación detallada del problema de los nombres de archivos confusos en las descargas de PHP
Al configurar el tipo de contenido en aplicación/flujo de octeto, puede descargar el contenido generado dinámicamente como un archivo. Creo que todos usarán la disposición de contenido para configurar el nombre del archivo descargado. El programa de descarga está escrito así: encabezado (Disposición del contenido: archivo adjunto; nombre de archivo = $ nombre de archivo);? gt;? un navegador
Pero si $filename está codificado en UTF, algunos navegadores no pueden manejarlo correctamente. Por ejemplo, cambiar ligeramente el encabezado anterior (Disposición del contenido: archivo adjunto; filename= $filename). ?gt;?
Guarde el programa como codificación UTF y luego acceda a IE. El nombre del archivo descargado será confuso. El nombre del archivo descargado en FF solo tiene dos caracteres chinos. p>
El encabezado de salida real Así es como se ve
Disposición del contenido: archivo adjunto; nombre de archivo chino txt
De hecho, según la definición de RFC, codificación en varios idiomas La disposición del contenido debe definirse así: Disposición del contenido: archivo adjunto* = utf E B ADE E E BBB E D txt
Es decir,
Agregue * antes del signo igual después nombre de archivo. El valor del nombre de archivo se divide en tres secciones con comillas simples, que son lenguaje de juego de caracteres (utf) ((vacío) y el nombre del archivo codificado en URL se agrega mejor con comillas dobles; de lo contrario, la parte después de los espacios en el nombre del archivo se agregará 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á los espacios con Esto debe reemplazarse con
Después de la prueba, se encontró. que el soporte de varios navegadores convencionales es el siguiente:
archivo adjunto IE=
archivo adjunto FF; nombre de archivo UTF
archivo adjunto*= utf;
O archivo adjunto; nombre de archivo = nombre de archivo UTF
¿Safari (Win) no parece admitirlo? Ninguno de los métodos anteriores funciona
¿Parece que el programa debe escribirse de esta manera para admitir todos los navegadores convencionales
$encoded_filename = urlencode($filename $encoded_filename = str_replace); (
$encoded_filename); header( Tipo de contenido: aplicación/flujo de octeto
if (preg_match( /MSIE/ $ua)) { header( Disposición del contenido:
archivo adjunto;
nombre de archivo= $nombre_archivo_codificado ); } else if (preg_match( /Firefox/ $ua))
{ encabezado( Disposición del contenido: archivo adjunto; nombre de archivo*= utf \ \ $ nombre de archivo);}
?else { encabezado( Disposición del contenido: archivo adjunto; nombre de archivo= $nombre de archivo }print ABC ;?gt; Artículo/programa/PHP/201311/21454