Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > получить mime-тип файла


Автор: bars80080 4.2.2009, 18:00
хочу получить mime-тип файла

mime_content_type($f); почему-то не работает (вызов неизвестной функции)
http://www.mediawiki.org/wiki/Manual:Mime_type_detection как я понял надо опереться на http://php.net/manual/en/ref.fileinfo.php , но опять из их описания не понял ровным счётом ничего. там даже нигде не передаётся имя файла

собсна, как получить мим-тип?





здесь расскажу саму задачу, может кто посоветует иное решение.
проблема возникла из сохранения на сервере файлов с русскими именами. однозначно рубить концы и транслитировать не хотелось (попробуй потом объясни каждому менегеру, почему он кладёт файл с одним именем, а получает с другим), а внешний сервак отказался отдавать файлы с кирилицей в имени. там стоит запутанный .htaccess, который видать не видя этот файл (с латиницей всё в порядке) сливает на главную страницу.
думал закодировать во что-нибудь, но опять же скачивающий пользователь не получит оригинальное название. решил последнюю меру: считывать файл и отдавать через скрипт readfile (количество скачек будет не очень большое). однако, встал вопрос в правильном определении мим-типа, чтобы отправить соответствующий заголовок.

Автор: skyboy 4.2.2009, 18:29
Цитата(bars80080 @  4.2.2009,  17:00 Найти цитируемый пост)
и отдавать через скрипт readfile

а смысл? В заголовке content-disposition можно указывать имя скачиваеемого файла, но там только латиницу/цифры/подчеркивание можно применять(т.е. символы из семибитного сегмента кодировки).

Добавлено через 1 минуту и 25 секунд
Цитата(bars80080 @  4.2.2009,  17:00 Найти цитируемый пост)
там даже нигде не передаётся имя файла

да ладно. там даже пример http://www.php.net/manual/en/function.finfo-open.php:
Код

$finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); // return mime type ala mimetype extension

if (!$finfo) {
    echo "Opening fileinfo database failed";
    exit();
}

/* get mime-type for a specific file */
$filename = "/usr/local/something.txt";
echo $finfo->file($filename);

/* close connection */
$finfo->close();

вполне себе передается имя файла.

Автор: bars80080 4.2.2009, 18:55
ну, значит у меня не совпадает с этим мануалом восприятие

результат:

Class 'finfo' not found 





так что же, никакой вариантов кроме транслита?

Автор: ksnk 4.2.2009, 19:31
Дык, а расширение mime подключено? Скорее всего нет. А расширение filenfo ? Видимо тоже...

В принципе - mime читает сигнатуры файлов и на основании их делает вывод что за файл. Как правило, все сигнатуры располагаются в первом килобайте файла. При некотором желании можно самому заняться их анализом  smile 

Список сигнатур и примерный алгоритм их анализа можно взять из файла magic.mime. Файл брать из любого дистрибута PHP... Правда там их дофига, так что лучше выбрать только нужные... 



Автор: skyboy 4.2.2009, 19:57
Цитата(bars80080 @  4.2.2009,  17:55 Найти цитируемый пост)
никакой вариантов кроме транслита? 

чтоб вернуть файл динамически через content-Type + content-disposition: attachement - нет, больше нет. правда, некоторые браузеры вполне принимают utf-имя файла(проверять - проверял, но какие браузеры - точно уже не скажу). потому если, скажем, ориентироваться только на opera, то можно и без транслита использовать.
Цитата(bars80080 @  4.2.2009,  17:55 Найти цитируемый пост)
Class 'finfo' not found 

значит, не подключено расширение. хостер позволяет редактировать php.ini? 

Автор: bars80080 4.2.2009, 20:56
Цитата(ksnk @  4.2.2009,  18:31 Найти цитируемый пост)
Список сигнатур и примерный алгоритм их анализа можно взять из файла magic.mime

да, наверно, так лучше было бы. но теперь не зачем


Цитата(skyboy @  4.2.2009,  18:57 Найти цитируемый пост)
значит, не подключено расширение. хостер позволяет редактировать php.ini

с теми хостерами вообще договариваться тяжело. на нет и суда нет, будем транслитировать

Автор: skyboy 4.2.2009, 23:25
собственно, нарыл довольно подробный(но неизвестно, насколько актуальный) http://www.jtricks.com/bits/content_disposition.html использования content-disposition: attachment в разных браузерах.

Автор: bars80080 5.2.2009, 12:54
ну вот, а я уже было пал духом. всё нормально прокатило в ИЕ6, ИЕ7, ФФ3 и опера 9.50

примерно в таком виде:

Код

if(!file_exists($file)) { echo 'file is not exists'; exit; }

header('Content-Type: application/x-unknown; charset=cp1251');
header('Content-Disposition: attachment; filename='.$file);

$a = readfile($file);
if($a === false) { echo 'cannot given file'; }
exit;

файлы сохраняются с нормальными русскими именами. осталось только попробовать, можно ли использовать кавычки в имени (')



остался такой вопрос: readfile насколько сильно напрягает сервер? я так понимаю, что не мало систем работает в таком духе, но всё же хотелось бы узнать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)