Durch die Einstellung von Content-Type auf application/octet-stream können dynamisch generierte Inhalte als Datei heruntergeladen werden. Ich glaube, das weiß jeder. Verwenden Sie dann Content-Disposition, um den Namen der heruntergeladenen Datei festzulegen. Viele Leute wissen das. Grundsätzlich ist das Download-Programm wie folgt geschrieben:
<?php$filename = „document.txt“;header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print „Hallo!“;?>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:
<?php$filename = "Chinesischer Dateiname.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print „Hallo!“;?> Wenn Sie das Programm in UTF-8-Kodierung speichern und dann darauf zugreifen, wird der vom IE6 heruntergeladene Dateiname 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 „%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt“ bedeutet:
* vor dem Gleichheitszeichen hinzufügen nach Dateiname
Der Wert von Dateiname ist in drei Segmente mit einfachen Anführungszeichen unterteilt: Zeichensatz (utf8), Sprache (leer) und URL-codierter Dateiname.
Es ist am besten, doppelte Anführungszeichen hinzuzufügen, da sonst der Teil nach dem Leerzeichen im Dateinamen nicht in Firefox angezeigt wird. Beachten Sie, dass das Ergebnis von urlencode nicht mit dem Ergebnis der PHP-URLencode-Funktion übereinstimmt +, und hier muss es durch %20 ersetzt werden
Nach dem Testen wurde festgestellt, dass die Unterstützung mehrerer Mainstream-Browser wie folgt ist:
IE6-Anhang filename="<UTF-8-Dateiname nach URL-Kodierung>"
FF3-Anhang; Dateiname="UTF-8-Dateiname"
Anhang; Dateiname*=“utf8“<UTF-8-Dateiname nach URL-Kodierung>“
O9-Anhang; Dateiname="UTF-8-Dateiname"
Safari3 (Win) scheint nicht unterstützt zu werden? Keine der oben genannten Methoden funktioniert
. Es scheint, dass das Programm so geschrieben sein muss, um alle gängigen Browser zu unterstützen:
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "Chinese file name.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 ';? >