PHPは多種のフォーマットのファイルのダウンロードを実現してそして文字化けしの問題を解決します


ここ数日プロジェクトを书いて、1つの问题に出会って、普通のファイルのダウンロードはまだ言うことができて、しかしもし中国语のしかも多种のフォーマットのファイルのダウンロードがあるならば比较的に难しくて、长い间バグを调整して、
最終的に完了するには、次の点に注意してください.
1.ファイル名が中国語のファイルについて、トランスコードを覚えて、中国語の文字化けしの発生を防止しなければならない.大部分のホストのコードはGB 2312で、私たちはUTF-8を使っているからだ.
だから操作する前にiconv()関数でトランスコードして、ファイルが見つからずにエラーを報告しないようにします.
2.ダウンロードするファイルのフォーマットを判断し、フォーマットに基づいてヘッダ()関数を書き直す必要があります.
具体的なコードは以下の通りです.
<?php 
	header("Content-type:text/html;charset=utf-8");
	
        $filename = "        .docx";  //   
	$filename = iconv("utf-8","gb2312//IGNORE",$filename);  //  
	$file = "upload/".$filename;  //    
	$len = filesize($file);  //    
        $file_extension = strtolower(substr(strrchr($filename,"."),1));  //     
 
    switch( $file_extension )   //      
    {
      case "pdf": $ctype="application/pdf"; break;
      case "exe": $ctype="application/octet-stream"; break;
      case "zip": $ctype="application/zip"; break;
      case "docx":
      case "doc": $ctype="application/msword"; break;
      case "xls": $ctype="application/vnd.ms-excel"; break;
      case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
      case "gif": $ctype="image/gif"; break;
      case "png": $ctype="image/png"; break;
      case "jpeg":
      case "jpg": $ctype="image/jpg"; break;
      case "mp3": $ctype="audio/mpeg"; break;
      case "wav": $ctype="audio/x-wav"; break;
      case "mpeg":
      case "mpg":
      case "mpe": $ctype="video/mpeg"; break;
      case "mov": $ctype="video/quicktime"; break;
      case "avi": $ctype="video/x-msvideo"; break;
 
      case "php":
      case "htm":
      case "html": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;
 
      default: $ctype="application/force-download";
    }
 
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer");
     
    header("Content-Type: $ctype");
 
    $header="Content-Disposition: attachment; filename=".$filename.";";
    header($header);
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$len);
    readfile($file);

?> 

異なるブラウザに適している場合、中国語の文字化けしエラーを避けるために、私はネット上でコードを見つけて、避けることができます.コードは以下の通りです.
<?php
 
<span style="white-space:pre">	</span>$ua = $_SERVER["HTTP_USER_AGENT"];
 
<span style="white-space:pre">	</span>$filename = "      .txt";
<span style="white-space:pre">	</span>$encoded_filename = urlencode($filename);
<span style="white-space:pre">	</span>$encoded_filename = str_replace("+", "%20", $encoded_filename);
 
<span style="white-space:pre">	</span>header('Content-Type: application/octet-stream');
 
<span style="white-space:pre">	</span>if (preg_match("/MSIE/", $ua)) {
    <span style="white-space:pre">		</span>header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
<span style="white-space:pre">	</span>} else if (preg_match("/Firefox/", $ua)) {
    <span style="white-space:pre">		</span>header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
<span style="white-space:pre">	</span>} else {
    <span style="white-space:pre">		</span>header('Content-Disposition: attachment; filename="' . $filename . '"');
<span style="white-space:pre">	</span>}
 
?>

私がこのコードを使っていない理由は上に書いたコードです.Firefox、IE、Opera、360などのブラウザを試してみましたが、ブラウザの問題で発生しませんでした.
発生した文字化けしエラーは、トランスコード後に中国語の文字化けしの問題が基本的に解決されたと思います.
私の経験は、参考にしてください.