如何在下载文件名中使用UTF8编码

通常在进行文件下载的时候,使用header函数发送请求头信息可以将动态生成的文件转为文件下载到用户本地.

通过发送http请求:

Content-type:application/octem-stream

将文件的内容设置成八进制文件流输出,保存到客户端.

通过发送http请求:

Content-Disposition:attachment;filename=‘$filename’;

设置下载的文件名:

$filename = 'new.rar'
if(!is_file($filename) && !is_readable($filename)){
    exit('文件不存在或者文件不可读');    
}
header('Content-Type:application/octem-stream');
//对下在的文件名进行编码
$fn=urlencode($filename);
header('Content-Disposition:attachement;filename="'.$filename.'"');
echo '下载完毕!';

虽然用这种方法是可以下载的,但是有个问题,如果文件名编码格式是utf8编码

那么使用这种方法下载的文件就不正确显示了

那么在设置下载的文件名时,我们应该对文件名进行编码,才能使得下载文件可以正常显示

设置编码的方式根据浏览器的不同,设置的方式也有所不同

下面列出几个常规的浏览器设置方法:

IE6    attachment; filename="<URL编码之后的UTF-8文件名>"    
FF3    attachment; filename="UTF-8文件名"    
       attachment; filename*="utf8''<URL编码之后的UTF-8文件名>"    
IE9   attachment; filename="UTF-8文件名"

注意:urlencode的结果与php的urlencode函数结果不太相同,php的urlencode会把空格替换成+,而这里需要替换成%20

下载文件的时候应该根据浏览器的不同而设置不同的文件名

$_SERVER['HTTP_USER_AGENT'] 可以获取当前浏览器的版本

<?php

    $filename = basename($_GET['file']);
    if(is_file($filename)||!is_readable($filename)){
        exit("没有找到指定的文件");
    }
    //当前输出的文档类型是一个八进制字节流
    header("Content-type:application/octem-stream");
    //处理中文的文件名
    $uname = urlencode($filename);
    $num   = preg_match('!+!',$uname,$res);

    if($num){
        //去除空格
         $chFname = str_replace('+','%20',$uname);
        }
    //获取当前浏览器 操作系统 和常用代码
     $userAgent = $_SERVER['HTTP_USER_AGENT'];
    
    if(preg_match('!MSIE!',$userAgent)){
        header('Content-Disposition:attachment;filename="'.$chFname.'"');
    }else if(preg_match('!Firefox!',$userAgent)){
        header("Content-Disposition:attachment;filename*=\"utf8''".$filename.'"')
    }else{
        header('Content-Disposition:attachment;filename="'.$filename.'"');
    }


你可能感兴趣的:(如何在下载文件名中使用UTF8编码)