php文件下载IE文件名乱码问题

来源:互联网 发布:阿里巴巴数据库多大 编辑:程序博客网 时间:2024/05/17 08:46

一直用chrome浏览器,没发现问题。今天用ie6,发现文件下载时文件名乱码,ie下迅雷下载文件名也是乱码。网上查了下说在ie下需要使用urlencode编码一下,我试了下

header('Content-Disposition: attachment; filename='. rawurlencode($file_name);
结果用ie下载还是乱码。php文件本身是gbk/gb2312编码,于是我先将$file_name转换成utf-8编码再进行urlencode

header('Content-Disposition: attachment; filename='. rawurlencode(iconv("GBK","UTF-8",$file_name)));
这样使用ie下载就没问题了,难道urlencode只能对utf-8进行转义编码?

还有就是获取远程文件的大小问题,php中的filesize函数只能对本地文件进行处理,处理远程文件会失败并发出一条警告,并且在windows平台传入的参数必须是gbk/gb2312编码,使用utf-8编码将无法访问系统中的资源。

在网上找了四种获取远程文件大小的方法,多谢前辈们的分享,记录一下:

方法一:header

<?php get_headers($url,true);  //返回结果 Array (     [0] => HTTP/1.1 200 OK     [Date] => Sat, 29 May 2004 12:28:14 GMT     [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)     [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT     [ETag] => "3f80f-1b6-3e1cb03b"     [Accept-Ranges] => bytes     [Content-Length] => 438     [Connection] => close     [Content-Type] => text/html ) ?> 

这里可以根据Content-Length直接获取大小了。

方法二:curl
function remote_filesize($uri,$user='',$pw='') {     // start output buffering     ob_start();     // initialize curl with given uri     $ch = curl_init($uri);     // make sure we get the header     curl_setopt($ch, CURLOPT_HEADER, 1);     // make it a http HEAD request     curl_setopt($ch, CURLOPT_NOBODY, 1);     // if auth is needed, do it here     if (!emptyempty($user) && !emptyempty($pw))     {         $headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw));         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);     }     $okay = curl_exec($ch);     curl_close($ch);     // get the output buffer     $head = ob_get_contents();     // clean the output buffer and return to previous     // buffer settings     ob_end_clean();      echo '<br>head-->'.$head.'<----end <br>';      // gets you the numeric value from the Content-Length     // field in the http header     $regex = '/Content-Length:\s([0-9].+?)\s/';     $count = preg_match($regex, $head, $matches);      // if there was a Content-Length field, its value     // will now be in $matches[1]     if (isset($matches[1]))     {         $size = $matches[1];     }     else     {         $size = 'unknown';     }     //$last=round($size/(1024*1024),3);     //return $last.' MB';     return $size; } 
方法三:fsock

function getFileSize($url) {     $url = parse_url($url);     if($fp = @fsockopen($url['host'],emptyempty($url['port'])?80:$url['port'],$error))     {         fputs($fp,"GET ".(emptyempty($url['path'])?'/':$url['path'])." HTTP/1.1\r\n");         fputs($fp,"Host:$url[host]\r\n\r\n");         while(!feof($fp))         {             $tmp = fgets($fp);             if(trim($tmp) == '')             {                 break;             }             elseif(preg_match('/Content-Length:(.*)/si',$tmp,$arr))             {                 return trim($arr[1]);             }         }         return null;     }     else     {         return null;     } }
方法四:file_get_contents

$fCont = file_get_contents("http://www.cnmiss.cn/"); echo strlen($fCont)/1024; 

原创粉丝点击