Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Implementierungscode zum Herunterladen von Dateien und Lösungen für verstümmelte Zeichen in Dateinamen

PHP-Implementierungscode zum Herunterladen von Dateien und Lösungen für verstümmelte Zeichen in Dateinamen

高洛峰
高洛峰Original
2016-12-23 12:44:051178Durchsuche

Jemand hat mich kürzlich gefragt, wie man Dateien herunterlädt. Die PHP-Methode lautet wie folgt:

<?php 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=ins.jpg"); 
readfile("imgs/test_Zoom.jpg"); 
?>

Die erste Codezeile dient zum Erzwingen des Downloads.
Die zweite Codezeile dient zum Zuweisen von a ; Name des heruntergeladenen Inhalts.
Die dritte Codezeile dient zum Einlesen des heruntergeladenen Inhalts in die Datei.
So lösen Sie verstümmelte Zeichen in PHP-Download-Dateinamen
Durch die Einstellung des Inhaltstyps auf Anwendung/Oktett-Stream können Sie dynamisch generierte Inhalte als Datei herunterladen. Ich glaube, das weiß jeder. Verwenden Sie dann Content-Disposition, um den Namen der heruntergeladenen Datei festzulegen. Viele Leute wissen das. Im Grunde ist das Download-Programm wie folgt geschrieben:

<?php 
$filename = "document.txt"; 
header(&#39;Content-Type: application/octet-stream&#39;); 
header(&#39;Content-Disposition: attachment; filename=&#39; . $filename); 
print "Hello!"; 
?>

Nachdem Sie es mit einem Browser geöffnet haben, können Sie document.txt herunterladen.
Wenn $filename jedoch UTF-8-codiert ist, können einige Browser damit nicht richtig umgehen. Wenn Sie beispielsweise das obige Programm leicht ändern:

<?php 
$filename = "中文 文件名.txt"; 
header(&#39;Content-Type: application/octet-stream&#39;); 
header(&#39;Content-Disposition: attachment; filename=&#39; . $filename); 
print "Hello!"; 
?>

Speichern Sie das Programm in UTF-8-Kodierung und greifen Sie dann darauf zu. Der vom IE6 heruntergeladene Dateiname wird verstümmelt. Der unter FF3 heruntergeladene Dateiname enthält nur das Wort „Chinesisch“. Unter Opera 9 funktioniert alles einwandfrei.
Der Ausgabeheader sieht tatsächlich so aus:
Content-Disposition: attachment filename=Chinese file name.txt Tatsächlich sollte die mehrsprachige Codierung Content-Disposition gemäß der Definition von RFC2231 wie folgt definiert werden:

Content-Disposition: attachment; filename*="utf8&#39;&#39;%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"

Das heißt:
Dem Gleichheitszeichen nach dem Dateinamen muss ein * vorangestellt werden.
Der Wert des Dateinamens ist in drei Segmente in einfache Anführungszeichen unterteilt: Zeichensatz (utf8) und Sprache (leer) und URL-codierter Dateiname.
Es ist am besten, doppelte Anführungszeichen hinzuzufügen, da sonst der Teil nach den Leerzeichen im Dateinamen nicht in Firefox angezeigt wird.
Beachten Sie, dass die Ergebnisse von urlencode nicht mit den Ergebnissen der urlencode-Funktion von PHP übereinstimmen ersetzt Leerzeichen durch + und muss durch %20 ersetzt werden
Nach dem Testen wurde festgestellt, dass die Unterstützung mehrerer Mainstream-Browser wie folgt ist:
IE6 filename="ff4acd846ad45dc3a75e30a01e4ace56"
FF3-Anhang; Dateiname="UTF-8-Dateiname"
Anhang; Dateiname*="utf8''8d255eec13502c2b32ba3706d578fe89"
O9-Anhang ; filename="UTF- 8File name "
Safari3(Win) scheint es nicht zu unterstützen? Keine der oben genannten Methoden wird funktionieren
Es scheint, dass das Programm so geschrieben sein muss, um alle gängigen Browser zu unterstützen:

<?php 
$ua = $_SERVER["HTTP_USER_AGENT"]; 
$filename = "中文 文件名.txt"; 
$encoded_filename = urlencode($filename); 
$encoded_filename = str_replace("+", "%20", $encoded_filename); 
header(&#39;Content-Type: application/octet-stream&#39;); 
if (preg_match("/MSIE/", $ua)) { 
header(&#39;Content-Disposition: attachment; filename="&#39; . $encoded_filename . &#39;"&#39;); 
} else if (preg_match("/Firefox/", $ua)) { 
header(&#39;Content-Disposition: attachment; filename*="utf8\&#39;\&#39;&#39; . $filename . &#39;"&#39;); 
} else { 
header(&#39;Content-Disposition: attachment; filename="&#39; . $filename . &#39;"&#39;); 
} 
print &#39;ABC&#39;; 
?>

Weitere verwandte Artikel zum PHP-Implementierungscode zum Herunterladen von Dateien und Lösungen für verstümmelte Zeichen in Dateinamen Bitte achten Sie auf die chinesische PHP-Website!

Stellungnahme:
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
Vorheriger Artikel:Rookies PHP-Notizen (4)Nächster Artikel:Rookies PHP-Notizen (4)