проблема mime_content_type с некоторым расширением

Я пробую mime_content_type()/finfo_open(). Это нормально для .doc, но возвращает «application/zip» для .docx и ничего для .xls

в чем проблема ? это проблема с моим браузером?


person hd.    schedule 08.01.2012    source источник


Ответы (2)


Этот вопрос в основном тот же: mime-updates">PHP 5.3.5 fileinfo() Тип MIME для файлов MS Office 2007 - обновления magic.mime?

И кажется, что решения нет. Это не ваш браузер, это «магический» файл mime, который пытался угадать, и нет никакого способа отличить docx от zip-файла, потому что docx на самом деле является zip-файлом!

person Ariel    schedule 08.01.2012

Если вы похожи на меня и можете использовать или не использовать серверы php>=5.3.0 по какой-либо причине и хотите использовать один набор кода для всех серверов и, возможно, настаиваете на том, чтобы как-то задействовать функцию mime_content_type для серверов, которые не имеют Fileinfo, то вы можете использовать наполовину готовое решение, подобное моему, которое заключается в создании функции замены, которая заключается в том, что на php >= 5.3.0 она использует Fileinfo, а в более ранних версиях, если имя файла заканчивается определенной строкой, уникальной для что-то, что вы хотите переопределить, возвращает ваше жестко запрограммированное значение и вызывает mime_content_type() для всех остальных типов. Однако, конечно, это НЕ будет работать, если файл имеет тип, который неправильно определяет mime_content_type() и где имя файла не заканчивается расширением, но это должно быть очень редко.

Такое решение может выглядеть примерно так:

function _mime_content_type($filename)
{

        //mime_content_type replacement that uses Fileinfo native to php>=5.3.0
    if( phpversion() >= '5.3.0' )
    {

        $result = new finfo();

        if (is_resource($result) === true)
        {
            return $result->file($filename, FILEINFO_MIME_TYPE);
        }

    }

    else
    {

        if( substr( $filename, -5, 5 ) == '.docx' )
            return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
        else if( substr( $filename, -5, 5 ) == '.xlsx' )
            return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
        else if( substr( $filename, -5, 5 ) == '.pptx' )
            return 'application/vnd.openxmlformats-officedocument.spreadsheetml.presentation';
        //amend this with manual overrides to your heart's desire


        return mime_content_type( $filename );

    }

}

а затем вам просто нужно заменить все ваши вызовы mime_content_type вызовами _mime_content_type.

person RedScourge    schedule 20.02.2013