如何在下载文件名中使用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.'"');
    }


转载于:https://my.oschina.net/osmyblog/blog/377220

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值