(c) Павел Беляев

При использовании статей с сайта добавляйте в копирайт © Блог Павла Беляева http://pavelb.ru

среда, 7 декабря 2011 г.

SMF 2.0 attach in Firefox 8

Проблема в том, что в форуме SMF версии 2.0 при скачивании вложений в новом фаерфоксе 8.0 ( FireFox 8 ) имя файла отдается не нужное, а index.php.

Вложения в SMF отдаются через PHP, т.е. передается заголовок и отправляется содержимое, вот в заголовке то вся и проблема.

оно отдается вот так
header('Content-Disposition: attachment; filename="datasheet.pdf"');

в старых фаерфоксах тебе предложит сохранить файл datasheet.pdf а в новом почему то имя будет index.php

решение - сделать так

header('Content-Disposition: attachment; filename=datasheet.pdf');

(предварительно вырезав все пробелы из имени файла)

открываем файл Sources/Display.php и находим строки 

if ($context['browser']['is_firefox'])
header('Content-Disposition: ' . $disposition . '; filename*="UTF-8\'\'' . preg_replace('~&#(\d{3,8});~e', '$fixchar(\'$1\')', $utf8name).'"');



меняем на
if ($context['browser']['is_firefox'])
header('Content-Disposition: ' . $disposition . '; filename*=UTF-8\'\'' . preg_replace('~&#(\d{3,8});~e', '$fixchar(\'$1\')', $utf8name));

теперь имя файла в фаерфоксе 8.0 передается правильно, но вот проблема с именами типа "Контрольная работа.doc" остается, файл сохраняется как "Контрольная" и расширение файла приходится дописывать самостоятельно после сохранения. Можно конечно же заставить посетителей форума делать правильные имена, а можно исправить и эту проблему следющим образом:

находим строчку  (в том же самом файле)

$utf8name = !$context['utf8'] && function_exists('iconv') ? iconv($context['character_set'], 'UTF-8', $real_filename) : (!$context['utf8'] && function_exists('mb_convert_encoding') ? mb_convert_encoding($real_filename, 'UTF-8', $context['character_set']) : $real_filename);

и после нее вставляем строку

$utf8name = str_replace(' ', '_', trim($utf8name));


теперь файл при сохранении будет иметь имя "Контрольная_работа.doc"




P.S.: Данное решение не совсем правильное, но я лично решил проблему так,
если вы знаете более рациональное решение, отписывайтесь в комментариях.





Комментариев нет:

Отправить комментарий