요즘 프로젝트를 진행하면서 문제가 발생했습니다. 일반적으로 파일을 다운로드하는 것은 쉽지만 중국어 및 여러 형식의 파일을 다운로드하는 것은 시간이 오래 걸립니다. BUG를 조정하려면
이 최종적으로 완료됩니다.
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>} ?>
.트랜스코딩 이후의 중국어 왜곡 코드 문제는 기본적으로 그런 것 같아요.
제 경험은 참고용입니다!
저작권 안내: 이 글은 해당 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.
위에서는 PHP가 다양한 형식의 파일을 다운로드하고 내용을 포함하여 문자 깨짐 문제를 해결하는 방법을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.