Установив для Content-Type значение application/octet-stream, динамически генерируемый контент можно загрузить в виде файла, я думаю, все это знают. Затем используйте Content-Disposition, чтобы установить имя загруженного файла. Многие это знают. По сути, программа загрузки написана так:
<?php$filename = «document.txt»;header('Content-Type: application/octet-stream');header('Content-Disposition: Attachment; filename=' . $filename);print «Привет!»;?>Открыв его в браузере, вы можете скачать document.txt.
Однако, если $filename имеет кодировку UTF-8, некоторые браузеры не смогут правильно его обработать. Например, немного измените приведенную выше программу:
<?php$filename = "Китайское имя файла.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: Attachment; filename=' . $filename);print «Hello!»;?> Если вы сохраните программу в кодировке UTF-8, а затем получите к ней доступ, имя файла, загруженного IE6, будет искажено. В имени файла, загруженного под FF3, есть только слово «Китайский». В Опере 9 все работает нормально.
Выходной заголовок на самом деле выглядит так:
Content-Disposition: Attachment; filename=Китайское имя файла.txt Фактически, согласно определению RFC2231, многоязычная кодировка Content-Disposition должна определяться следующим образом:
Content-Disposition: Attachment ; filename*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" означает:
добавьте * перед знаком равенства. после имени файла
Значение имени файла разделено на три сегмента с одинарными кавычками: набор символов (utf8), язык (пустой) и имя файла в кодировке urlencode.
Лучше всего добавлять двойные кавычки, иначе часть после пробела в имени файла не будет отображаться в Firefox. Обратите внимание, что результат urlencode не совпадает с результатом функции urlencode PHP. urlencode PHP заменит пробел на. +, и здесь его нужно заменить на %20
После тестирования было обнаружено, что поддержка нескольких основных браузеров выглядит следующим образом:
IE6 filename="<имя файла в формате UTF-8 после кодировки URL>"
вложение FF3="имя файла в формате UTF-8";
Attachment*="utf8"<имя файла UTF-8 после кодировки URL>"
O9 вложение = "Имя файла в формате UTF-8";
Safari3 (Win) кажется не поддерживается? Ни один из вышеперечисленных методов не работает
. Похоже, что программа должна быть написана так, чтобы поддерживать все основные браузеры:
<?php$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 '; >?