mime_content_type问题有一些扩展

时间:2012-01-08 10:07:43

标签: php mime-types file-extension

我尝试mime_content_type()/ finfo_open()。对.doc来说没问题但是为.docx返回'application / zip'而对.xls没有任何内容

有什么问题?这是我浏览器的问题吗?

2 个答案:

答案 0 :(得分:1)

这个问题基本相同:PHP 5.3.5 fileinfo() MIME Type for MS Office 2007 files - magic.mime updates?

似乎没有解决方案。这不是你的浏览器,它是一个试图猜测的模仿“神奇”文件,而且没有办法告诉docx和zipfile之间的区别,因为docx实际上是一个zipfile!

答案 1 :(得分:0)

如果你像我一样,可能会或者可能不会因为某种原因使用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。