phpファイルダウンロードIEファイル名文字化け問題
ずっとchromeブラウザを使っていたので、問題は見つかりませんでした.今日ie 6を使って、ファイルのダウンロードの时ファイル名が文字化けしていることを発见して、ieの下で雷のダウンロードのファイル名も文字化けしています.ネットで調べてieの下でurlencodeコードを使う必要があると言って、私は試してみました
また、リモートファイルのサイズを取得する問題では、phpのfilesize関数はローカルファイルのみを処理でき、リモートファイルの処理に失敗し、警告を発行します.windowsプラットフォームから入力されるパラメータはgbk/gb 2312符号化でなければなりません.utf-8符号化を使用すると、システム内のリソースにアクセスできません.
ネット上で4種類のリモートファイルの大きさを取得する方法を探して、先輩たちの分かち合いに感謝して、記録します:
方法1:header
ここではContent-Longthに基づいて直接サイズを取得できます.方法2:curl
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:fsockfunction 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;