ホームページ  >  記事  >  バックエンド開発  >  PHPが複数形式のファイルダウンロードを実装し文字化け問題を解決

PHPが複数形式のファイルダウンロードを実装し文字化け問題を解決

WBOY
WBOYオリジナル
2016-08-08 09:20:18963ブラウズ

ここ数日間、あるプロジェクトに取り組んでいて、通常のファイルのダウンロードは問題ありませんが、中国語であり、複数の形式がある場合、ダウンロードがより困難になります。

長年のバグがついに完成しました。次の点に注意する必要があります:

1. 中国語のファイル名を持つファイルについては、必ずトランスコードを行ってください。中国語の文字化け。ほとんどのホストのエンコーディングが GB2312 であり、UTF-8 である

を使用しているため、ファイルが変換できない場合のエラーを防ぐために、操作前に iconv() 関数を使用して をトランスコードする必要があります。見つけられた。

2. ダウンロードするファイルの形式を判断し、その形式に応じて header() 関数を記述する必要があります。

具体的なコードは次のとおりです:

<?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>}
 
?>

Me このコードが使用されない理由は、上で書いたコードをFirefox、IE、Opera、360などのブラウザで試してみたところ、ブラウザの問題による文字化けエラーは発生しなかったからです

漢字の文字化けの問題は基本的に解決されていると思います。

私自身の経験ですので、ご参考までに!

著作権声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。

以上、PHPで複数形式のファイルをダウンロードする方法と文字化けの問題を解決する方法を内容も含めて紹介しましたが、PHPチュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。