Heim > Artikel > Backend-Entwicklung > PHP implementiert das Herunterladen von Dateien in mehreren Formaten und löst Probleme mit verstümmeltem Code
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); ?>
<?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>} ?>
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.