phpファイルダウンロードIEファイル名文字化け問題


ずっとchromeブラウザを使っていたので、問題は見つかりませんでした.今日ie 6を使って、ファイルのダウンロードの时ファイル名が文字化けしていることを発见して、ieの下で雷のダウンロードのファイル名も文字化けしています.ネットで調べてieの下でurlencodeコードを使う必要があると言って、私は試してみました
header('Content-Disposition: attachment; filename='. rawurlencode($file_name);
の結果、ieでダウンロードしたのか、それとも文字化けしたのか.phpファイル自体はgbk/gb 2312符号化なので、まず$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/gb 2312符号化でなければなりません.utf-8符号化を使用すると、システム内のリソースにアクセスできません.
ネット上で4種類のリモートファイルの大きさを取得する方法を探して、先輩たちの分かち合いに感謝して、記録します:
方法1: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-Longthに基づいて直接サイズを取得できます.方法2: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; 
} 
方法3: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
"); fputs($fp,"Host:$url[host]\r
\r
"); 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; } }
メソッド4:file_get_contents
$fCont = file_get_contents("http://www.cnmiss.cn/"); 
echo strlen($fCont)/1024;