>  기사  >  백엔드 개발  >  PHP는 다양한 형식의 파일 다운로드를 구현하고 문자 깨짐 문제를 해결합니다.

PHP는 다양한 형식의 파일 다운로드를 구현하고 문자 깨짐 문제를 해결합니다.

WBOY
WBOY원래의
2016-08-08 09:20:181005검색

요즘 프로젝트를 진행하면서 문제가 발생했습니다. 일반적으로 파일을 다운로드하는 것은 쉽지만 중국어 및 여러 형식의 파일을 다운로드하는 것은 시간이 오래 걸립니다. 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>}
 
?>

그 이유는 다음과 같습니다. 이 코드를 사용하지 않는 이유는 위에서 작성했기 때문입니다. Firefox, IE, Opera, 360 등의 브라우저에서 코드를 시도했지만 브라우저 문제로 인한 잘못된 코드 오류는 없었습니다

.트랜스코딩 이후의 중국어 왜곡 코드 문제는 기본적으로 그런 것 같아요.

제 경험은 참고용입니다!

저작권 안내: 이 글은 해당 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.

위에서는 PHP가 다양한 형식의 파일을 다운로드하고 내용을 포함하여 문자 깨짐 문제를 해결하는 방법을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP 정적 파일 구성다음 기사:PHP 정적 파일 구성