PHP implementiert das Herunterladen von Dateien in mehreren Formaten und löst Probleme mit verstümmeltem Code

WBOY
Freigeben: 2016-08-08 09:20:18
Original
1011 Leute haben es durchsucht

Während ich heutzutage an einem Projekt arbeitete, ist das Herunterladen von Dateien im Allgemeinen einfach, aber das Herunterladen von Dateien auf Chinesisch und in mehreren Formaten dauerte lange Um anzupassen. BUG, ​​

ist endlich abgeschlossen, folgende Punkte sind zu beachten:

1 Der Dateiname ist auf Chinesisch. Denken Sie bei Dateien an die Transkodierung, um verstümmelte chinesische Zeichen zu vermeiden, da die Codierung der meisten Hosts GB2312 ist und wir UTF-8 verwenden,

also Verwenden Sie vor dem Betrieb die Funktion iconv() zum Transkodieren, um einen Fehler zu verhindern, wenn die Datei nicht gefunden werden kann.

2. Sie müssen das Format der herunterzuladenden Datei beurteilen und dann die Funktion header() entsprechend dem Format schreiben.

Der spezifische Code lautet wie folgt:

<?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);

?> 
Nach dem Login kopieren

Um sich an verschiedene Browser anzupassen und chinesische verstümmelte Fehler zu vermeiden Ich habe im Internet einen Code gefunden, der vermieden werden kann. Der Code lautet wie folgt:

<?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>}
 
?>
Nach dem Login kopieren

Der Grund, warum ich das getan habe Ich verwende diesen Code nicht, weil ich ihn oben geschrieben habe. Ich habe den Code in Browsern wie Firefox, IE, Opera, 360 usw. ausprobiert und es gab keinen verstümmelten Codefehler, der durch Browserprobleme verursacht wurde

Ich denke, das Problem des verstümmelten chinesischen Codes nach der Transkodierung ist im Grunde das gleiche.

Meine Erfahrung dient nur als Referenz!

Urheberrechtserklärung: Dieser Artikel ist ein Originalartikel des Bloggers und darf nicht ohne die Erlaubnis des Bloggers reproduziert werden.

Das Obige hat gezeigt, wie PHP Dateien in verschiedenen Formaten herunterladen und das Problem verstümmelter Zeichen lösen kann, einschließlich des Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage