Heim >Backend-Entwicklung >PHP-Problem >Was tun, wenn der Dateiname der heruntergeladenen PHP-Datei verstümmelt ist?

Was tun, wenn der Dateiname der heruntergeladenen PHP-Datei verstümmelt ist?

藏色散人
藏色散人Original
2022-10-21 10:36:592239Durchsuche

Lösung für verstümmelte Dateinamen beim Herunterladen von PHP-Dateien: 1. Setzen Sie „Content-Type“ auf „application/octet-stream“ 2. Setzen Sie „header('Content-Disposition: attachment; filename*="utf8'' ' . $filename . '"');} else {header(...)".

Was tun, wenn der Dateiname der heruntergeladenen PHP-Datei verstümmelt ist?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, PHP-Version 8.1, Dell G3-Computer.

Was tun, wenn der Name der PHP-Download-Datei verstümmelt ist?

Der Name der PHP-Download-Datei ist verstümmelt

Durch die Einstellung des Inhaltstyps auf Anwendung/Oktett-Stream kann der dynamisch generierte Inhalt als Datei heruntergeladen werden . Ich glaube das an alle Städte. Verwenden Sie dann Content-Disposition, um den Namen der heruntergeladenen Datei festzulegen. Viele Leute wissen das. Grundsätzlich ist das Download-Programm so geschrieben:

Der Code lautet wie folgt:

$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $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. Ändern Sie beispielsweise das obige Programm leicht:

Der Code lautet wie folgt:

$filename = "中文 文件名.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";

Speichern Sie das Programm in UTF-8-Kodierung und greifen Sie erneut 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:

Der Code lautet wie folgt:

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

Das heißt:

Fügen Sie vor dem Gleichheitszeichen nach

Dateiname * hinzu.

Der Wert des Dateinamens ist in drei Segmente mit einfachen 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 in Firefox nicht angezeigt wird.

Beachten Sie, dass das Ergebnis von urlencode nicht mit dem Ergebnis der urlencode-Funktion von PHP übereinstimmt die Leerzeichen mit + und Dies muss durch %20 ersetzt werden

Nach dem Testen wurde festgestellt, dass die Unterstützung mehrerer Mainstream-Browser wie folgt aussieht:

IE6 attachment; filename=""
FF3 attachment; filename="UTF-8文件名"
attachment; filename*="utf8''"
O9 attachment; filename="UTF-8文件名"

Safari3 (Win) scheint dies 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:

Der Code lautet wie folgt:

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

PHP Video Tutorial🎜“🎜

Das obige ist der detaillierte Inhalt vonWas tun, wenn der Dateiname der heruntergeladenen PHP-Datei verstümmelt ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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